嘗試?yán)L制從 .obj 文件加載的立方體時(shí),所有三角形共享一個(gè)點(diǎn)。此外,并非所有三角形似乎都在渲染。我注意到更改 glDrawElements 的頂點(diǎn)計(jì)數(shù)允許繪制其他三角形,但我不確定為什么點(diǎn)數(shù)會(huì)大于正在使用的索引數(shù)。我已經(jīng)檢查了文件(似乎)是否與調(diào)試器一起正確加載,因?yàn)椋涸谀P蛯?duì)象類“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}每個(gè)材料組都有 6 個(gè)索引,這些索引從 obj 文件中偏移 -1。(.obj 指數(shù)從 1 開始,而不是 0)每個(gè)材料組的索引都在單獨(dú)的行上(在繪制調(diào)用期間也從調(diào)試器中提?。﹞ 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在模型對(duì)象類中: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 是索引緩沖區(qū) v坐標(biāo)是包含所有頂點(diǎn)的緩沖區(qū)源全可以位于:https://github.com/TheIncgi/GLES_GAME_fixed/blob/master/app/src/main/java/com/theincgi/gles_game_fixed/geometry/ModelLoader2.java當(dāng)前結(jié)果:當(dāng)前渲染問題目標(biāo):立方體的外觀編輯 1:修復(fù)了格式問題
1 回答

慕容3067478
TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
glDraw 元素
的第三個(gè)參數(shù)指定索引列表中值的類型。
緩沖區(qū) () 是一個(gè)緩沖區(qū),其中每個(gè)元素有 4 個(gè)字節(jié)。iv
int
IntBuffer iv, it, in;
但 OpenGL 枚舉器常量指示緩沖區(qū)是值的緩沖區(qū),其中每個(gè)值的大小為 2 個(gè)字節(jié):GL_UNSIGNED_SHORT
short
GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_SHORT, iv);
如果 OpenGL ES 版本支持 ,那么只需更改即可解決問題:GL_UNSIGNED_INT
GL_UNSIGNED_SHORT
GL_UNSIGNED_INT
GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_INT, iv);
如果未入,則必須將 a 裝箱而不是 :GL_UNSIGNED_INT
ShortBuffer
IntBuffer
ShortBuffer iv; GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLS20.GL_UNSIGNED_SHORT, iv);
添加回答
舉報(bào)
0/150
提交
取消