亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復 OpenGLES GLDRAWELEMENTS

如何修復 OpenGLES GLDRAWELEMENTS

絕地無雙 2022-09-14 17:56:59
嘗試繪制從 .obj 文件加載的立方體時,所有三角形共享一個點。此外,并非所有三角形似乎都在渲染。我注意到更改 glDrawElements 的頂點計數允許繪制其他三角形,但我不確定為什么點數會大于正在使用的索引數。我已經檢查了文件(似乎)是否與調試器一起正確加載,因為:在模型對象類“vCoords”中包含:{ 1.0,  1.0,  1.0, -1.0, -1.0,  1.0,  1.0, -1.0,  1.0, -1.0,  1.0,  1.0, -1.0, -1.0, -1.0,  1.0, -1.0, -1.0,  1.0,  1.0, -1.0, -1.0,  1.0, -1.0}每個材料組都有 6 個索引,這些索引從 obj 文件中偏移 -1。(.obj 指數從 1 開始,而不是 0)每個材料組的索引都在單獨的行上(在繪制調用期間也從調試器中提?。﹞ 3, 6, 7, 3, 0, 6 }  //yellow{ 0, 5, 6, 0, 2, 5 }  //blue{ 5, 7, 6, 5, 4, 7 }  //purple{ 2, 4, 5, 2, 1, 4 }  //red{ 1, 7, 4, 1, 3, 7 }  //white{ 0, 1, 2, 0, 3, 1 }  //light green在模型對象類中:public void draw(float[] mvpm, GLProgram program){        int mvpmH  = program.getUniformLocation("mvpm");        GLES20.glEnableVertexAttribArray(posH);        GLES20.glVertexAttribPointer(                posH,                COORDS_PER_VERTEX,                GLES20.GL_FLOAT,                    false,                COORDS_PER_VERTEX*Float.BYTES,                vCoords);        GLES20.glUniformMatrix4fv(mvpmH, 1, false, mvpm,0 );        GLErrorLogger.check();        for(MaterialGroup materialGroup : groups){            materialGroup.draw(program);        }        GLES20.glDisableVertexAttribArray(posH);        GLErrorLogger.check();}在“材料組”類中:public void draw(GLProgram program){        GLErrorLogger.check();        int colorH = program.getUniformAttribLocation("vColor");        GLErrorLogger.check();        GLES20.glUniform4fv(colorH, 1, material.diffuse, 0);        GLErrorLogger.check();        //GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, points);        GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(),                  GLES20.GL_UNSIGNED_SHORT, iv);        GLErrorLogger.check();}iv 是索引緩沖區 v坐標是包含所有頂點的緩沖區源全可以位于:https://github.com/TheIncgi/GLES_GAME_fixed/blob/master/app/src/main/java/com/theincgi/gles_game_fixed/geometry/ModelLoader2.java當前結果:當前渲染問題目標:立方體的外觀編輯 1:修復了格式問題
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

glDraw 元素的第三個參數指定索引列表中值的類型。

緩沖區 () 是一個緩沖區,其中每個元素有 4 個字節。ivint

IntBuffer   iv, it, in;

但 OpenGL 枚舉器常量指示緩沖區是值的緩沖區,其中每個值的大小為 2 個字節:GL_UNSIGNED_SHORTshort

GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_SHORT, iv);

如果 OpenGL ES 版本支持 ,那么只需更改即可解決問題:GL_UNSIGNED_INTGL_UNSIGNED_SHORTGL_UNSIGNED_INT

GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_INT, iv);

如果未入,則必須將 a 裝箱而不是 :GL_UNSIGNED_INTShortBufferIntBuffer

ShortBuffer iv;

GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLS20.GL_UNSIGNED_SHORT, iv);


查看完整回答
反對 回復 2022-09-14
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號