深度测试与模板测试
深度测试
- 大部分系统的深度缓冲是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间深度值,使用如下公式进行深度标准化。
不过事实上一般使用的是非线性的公式
- 近处的物体距离对于深度值的影响较大,越靠近平面对应的深度值就越大。
- 深度冲突,就是两个形状叠加在一起的时候不停得交换争夺谁在顶端,防止的办法:
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);
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~