0%

OpenGL问题集锦

清屏和Color Mask的顺序

其实很好理解,glColorMask是写入的开关,glClear作为rendering command,也是要受到glColorMask的作用的。但是,

1
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
1
2
3
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
有顺序问题。glColorMask、glClearColor、glClearDepth都是设置状态的,都需要在glClear之前调用

glActiveTexture和glBindTexture的依赖

1
2
3
glActiveTexture(GL_TEXTURE10);

glBindTexture(GL_TEXTURE_2D, 0)

比如这种,当前使用的纹理单元是GL_TEXTURE10,glBindTexture绑定会导致GL_TEXTURE10解绑或者绑定到其他纹理。如果多个纹理只想绑定一次,但是后续又有绑定需求的代码,需要注意可能存在的相互影响问题。

视口大小和FBO大小的匹配

渲染uvmesh的时候,glViewport设置了image unit的宽高,且通过imageStore/gl_FragCoord来写入image unit;但是没有绑定image unit大小一致的FBO(绑定的默认framebuffer),视口的高比默认FBO的高更大,导致渲染场景y正方向的一部分没有渲染。如果是3D视角的场景,通过拖动视角比较好发现这个问题,但是uvmesh是固定坐标范围,不太好发现场景上部分消隐的变化,尤其是隐藏范围比较小的时候。

×