OpenGL ES C++索引使用异常 调用glDrawElements渲染OBJ平面出错
问题根因与修复方案
1. 索引数组配置错误(核心渲染异常原因)
你的索引数组没有正确三角化OBJ中的四边形平面:
OBJ文件中面的顶点顺序是f 1/1/1 2/2/1 4/3/1 3/4/1,OBJ索引从1开始计数,转成OpenGL使用的0基索引后,四个顶点顺序为0、1、3、2。你当前写的索引会导致两个三角形重叠、无法覆盖完整矩形区域。
将索引数组修改为如下任意一种即可:
// 方案1 按OBJ面顺序三角化 GLushort squareindices[] = { 0, 1, 3, 0, 3, 2 };
// 方案2 另一种常规四边形三角化写法 GLushort squareindices[] = { 0, 1, 2, 1, 3, 2 };
2. 需修复的性能与内存问题
你当前的渲染逻辑存在严重的资源浪费和内存泄漏:
- 着色器程序创建、属性/uniform位置查询逻辑全部写在了render函数中,相当于每渲染一帧就重新编译链接着色器,开销极大,这部分逻辑应该挪到类初始化方法中仅执行一次,不要每次渲染都创建、删除着色器程序
- render函数中new出来的
programGenerator、matrixOperation对象没有释放,直接造成内存泄漏,建议改成栈上实例化,或者用完立即调用delete释放 - 投影矩阵、模型矩阵如果没有参数(窗口大小、模型位置/旋转角度)变更,不需要每帧重复计算,可以在参数变动时单独更新
3. 扩展提示
如果你后续需要用到OBJ中带的纹理坐标、法向量数据,需要额外增加对应顶点属性的加载、指针配置逻辑,当前仅渲染纯色平面不受影响。
内容的提问来源于stack exchange,提问作者utkarsh choudhary
相关产品推荐
相关产品推荐

