1.GL状态还原
GL相当于状态机,当开启一个状态需要关闭状态进行还原状态避免下个渲染状态出错导致渲染错误
2.glDrawElements 1282报错问题
这个问题找了挺久,单独绘制没问题,和C++ 3D渲染引擎一起绘制就会有时报错1282,初步判断3D渲染引擎的封装改变了GL状态,根据断点和现象分析,最后绘制是3D模型就会报错,而2D的不会。只好继续分析3D和2D的流程,才发现GL_ELEMENT_ARRAY_BUFFER被改变导致
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
3.GL录屏深度缓冲区问题
开启录屏后,3D模型渲染有问题,结合现象判断可能是抗锯齿或者深度问题,同样深度16依然有问题,用 GLES11Ext.GL_DEPTH_COMPONENT24_OES 深度24才解决。
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES11Ext.GL_DEPTH_COMPONENT24_OES, width, height);
4.3D透明深度缓冲区
3D模型开启深度测试透明渲染有问题,可以设置当前node的TAG是否透明,根据在render的时候node的TAG判断是否需要开启glDepthMask,glDepthMask 用来判断允许或不允许写入深度缓冲区,也可以用渲染队列统一管理,避免频繁开关glDepthMask
glDepthMask(GL_TRUE);
5.shader UV镜像翻转
图像需要镜像翻转,shader UV进行转换一下就行了,或者通过矩阵运算也可以解决问题
x轴镜像:1.0-vTextureCoord.x
y轴镜像:1.0-vTextureCoord.y
6.3D模型表情的Alpha测试(使用Discard)
3D模型的表情是带有透明的贴图,渲染出来透明的地方带颜色且半透着背景,通过现象观察,感觉不渲染透明的片段就可以了,用Discard实现Alpha测试。
#if defined(TEXTURE_DISCARD_ALPHA)
if (gl_FragColor.a < 0.25)
discard;
#endif
上面片段着色器代码Texture是RGBA,Alpha通道用于Alpha测试。Alpha值小于0.25,就会被Discard“杀死”片段,不渲染这个片段。当然0.25不是固定值,可以根据需求更改。如果你的片段着色器没有用到defined,直接写下面代码即可
if (gl_FragColor.a < 0.25)
discard;
7.透明剔除(使用blend混合)
用Discard实现Alpha剔除,旋转或者缩放发现不太稳定,所以推荐使用blend混合进行Alpha剔除
blendSrc = SRC_ALPHA
blendDst = ONE_MINUS_SRC_ALPHA