深度测试与模板测试

深度测试

  • 大部分系统的深度缓冲是24位的,深度缓冲会和深度值进行比较,如果通过则更新,否则丢弃。
  • 屏幕坐标可以在GLSL中通过gl_FragCoord在片段着色器中访问,其中的z是片段的真正深度。
  • glEnable(GL_DEPTH_TEST)用来开启深度测试,同时glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);用来在下次迭代渲染开始前,清除缓冲.
  • 控制通过深度缓冲的条件:glDepthFunc(GL_LESS);
  • 深度缓冲包含一个0.0到1.0间深度值,使用如下公式进行深度标准化。
    image
    不过事实上一般使用的是非线性的公式
    image
  • 近处的物体距离对于深度值的影响较大,越靠近平面对应的深度值就越大。
  • 深度冲突,就是两个形状叠加在一起的时候不停得交换争夺谁在顶端,防止的办法:

    1.避免靠太近
    2.把近平面设置远一些
    3.使用更高精度的深度缓冲

模板测试

  • 模板测试是根据模板缓冲来的,每个模板值是8位的,模板的案例:
    图片
  • glStencilFunc(GLenum func, GLint ref, GLuint mask)func用来设置模板测试函数,ref设置了模板测试的参考值,mask掩码,与参考值进行And操作。
  • glStencilFunc(GL_EQUAL, 1, 0xFF)设定如何更新缓冲。

物体轮廓

glEnable(GL_DEPTH_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);  

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

glStencilMask(0x00); // 记得保证我们在绘制地板的时候不会更新模板缓冲
normalShader.use();
DrawFloor()  

glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilMask(0xFF); 
DrawTwoContainers();

glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00); 
glDisable(GL_DEPTH_TEST);
shaderSingleColor.use(); 
DrawTwoScaledUpContainers();
glStencilMask(0xFF);
glEnable(GL_DEPTH_TEST);  

引用

posted @ 2022-10-11 16:11  梦呓qwq  阅读(172)  评论(0编辑  收藏  举报