大同建设银行保安招聘网站,wordpress外汇主题,口碑营销,重庆做网站哪个好些嘛一、深度缓冲
深度缓冲就像颜色缓冲(Color Buffer)#xff08;储存所有的片段颜色#xff1a;视觉输出#xff09;一样#xff0c;在每个片段中储存了信息#xff0c;并且#xff08;通常#xff09;和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的储存所有的片段颜色视觉输出一样在每个片段中储存了信息并且通常和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的它会以16、24或32位float的形式储存它的深度值。在大部分的系统中深度缓冲的精度都是24位的。
当深度测试(Depth Testing)被启用的时候OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试如果这个测试通过了的话深度缓冲将会更新为新的深度值。如果深度测试失败了片段将会被丢弃。
深度缓冲是在片段着色器运行之后屏幕空间中运行的。屏幕空间坐标与通过OpenGL的glViewport所定义的视口密切相关并且可以直接使用GLSL内建变量gl_FragCoord从片段着色器中直接访问。gl_FragCoord的x和y分量代表了片段的屏幕空间坐标其中(0, 0)位于左下角。gl_FragCoord中也包含了一个z分量它包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的那个值。
深度测试默认是禁用的启用深度测试
glEnable(GL_DEPTH_TEST);
启用了深度缓冲需要在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
使用一个只读的(Read-only)深度缓冲禁用深度缓冲的写入只需要设置它的深度掩码(Depth Mask)设置为GL_FALSE就可以了
glDepthMask(GL_FALSE);
OpenGL允许我们修改深度测试中使用的比较运算符。这允许我们来控制OpenGL什么时候该通过或丢弃一个片段什么时候去更新深度缓冲。我们可以调用glDepthFunc函数来设置比较运算符或者说深度函数(Depth Function)
glDepthFunc(GL_LESS);
这个函数接受下面表格中的比较运算符 默认情况下使用的深度函数是GL_LESS它将会丢弃深度值大于等于当前深度缓冲值的所有片段。 二、深度冲突
一个很常见的视觉错误会在两个平面或者三角形非常紧密地平行排列在一起时会发生深度缓冲没有足够的精度来决定两个形状哪个在前面。结果就是这两个形状不断地在切换前后顺序这会导致很奇怪的花纹。这个现象叫做深度冲突(Z-fighting)。
深度冲突是深度缓冲的一个常见问题当物体在远处时效果会更明显因为深度缓冲在z值比较大的时候有着更小的精度。 防止深度冲突
以下技巧可以减轻或者完全避免深度冲突
1永远不要把多个物体摆得太靠近以至于它们的一些三角形会重叠。
2尽可能将近平面设置远一些。
3使用更高精度的深度缓冲虽然会牺牲一些性能。 demo下载点击跳转
效果 觉得有帮助的话打赏一下呗。。