猿问

如何修复 OpenGLES GLDRAWELEMENTS

尝试绘制从 .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:修复了格式问题


绝地无双
浏览 123回答 1
1回答

慕容3067478

glDraw 元素的第三个参数指定索引列表中值的类型。缓冲区 () 是一个缓冲区,其中每个元素有 4 个字节。ivintIntBuffer   iv, it, in;但 OpenGL 枚举器常量指示缓冲区是值的缓冲区,其中每个值的大小为 2 个字节:GL_UNSIGNED_SHORTshortGLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_SHORT, iv);如果 OpenGL ES 版本支持 ,那么只需更改即可解决问题:GL_UNSIGNED_INTGL_UNSIGNED_SHORTGL_UNSIGNED_INTGLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLES20.GL_UNSIGNED_INT, iv);如果未入,则必须将 a 装箱而不是 :GL_UNSIGNED_INTShortBufferIntBufferShortBuffer iv; GLES20.glDrawElements(GLES20.GL_TRIANGLES, iv.limit(), GLS20.GL_UNSIGNED_SHORT, iv);
随时随地看视频慕课网APP

相关分类

Java
我要回答