OpenGL踩过的坑
学习OpenGL的过程中想要实现一些效果,遇到的坑和找到的解决方案,记录一下。
模板缓冲
glStencilMask(0x00)
会使缓冲无效,也会使清空无效!清空之前模板缓冲要设置glStencilMask(0xFF)
。使用
glViewport
设置视口大小。如果不想结果看起来拉伸,视口的长宽比要和相机相同技巧:使用
glViewport
来渲染小窗,而不是使用子窗口:How to use subwindows in opengl - Stack Overflow。使用glViewport
来渲染小窗时要避免glClear
清空带来的影响,glClear
会直接清空整个页面。解决方法是使用glScissor
:opengl - Shouldn't glClearColor() obey the drawing area set by glViewport()? - Stack Overflow。如果是重叠的窗口,注意渲染顺序,先渲染大的,再渲染小的。几何着色器中,
gl_position
应该是在NDC空间中,所以对它的处理也要在NDC中处理。例如法向量必须通过gl_position
求出NDC空间下的法向量,不能使用相机坐标系中的法向量;同理对不能用NDC的法向量对相机坐标系中点做处理。它们必须分开处理。传递给片元着色器计算光照应该是相机坐标系中的点,而不是NDC空间中的点。帧缓冲附加纹理要在帧缓冲激活前附加上去!
模板帧缓冲的使用:framebuffer - Binding a stencil render buffer to a frame buffer in opengl - Stack Overflow
opengl - Access depth-stencil texture in a shader program - Stack Overflow
macos - Visualizing the Stencil Buffer to a texture - Stack Overflow