gl_FragDepth = 0.0; // 这个片段现在的深度值为 0.0 如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值。 然而,由我们自己设置深度值有一个很大的缺点,只要我们在片段着色器中对gl_FragDepth进行写入,OpenGL就会(像深度测试小节中讨论的那样)禁用所有的提前深度测试(Early Depth Testing)。...
gl_FragDepth=0.0; // 这个片段现在的深度值为 0.0 如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值。 然而,由我们自己设置深度值有一个很大的缺点,只要我们在片段着色器中对gl_FragDepth进行写入,OpenGL就会禁用所有的提前深度测试(Early Depth Testing)。它被禁用的原因是,OpenGL无法在片...
gl_FragDepth = 1.0; // 这个片段现在的深度值为 1.0 如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值。 然而,由我们自己设置深度值有一个很大的缺点,只要我们在片段着色器中对gl_FragDepth进行写入,OpenGL就会(像深度测试小节中讨论的那样)禁用所有的提前深度测试(Early Depth Testing)。...
0,sizeof(positions),&positions);glBufferSubData(GL_ARRAY_BUFFER,sizeof(positions),sizeof(normals),&normals);glBufferSubData(GL_ARRAY_BUFFER,sizeof(positions)+sizeof(normals),sizeof(tex),&tex);
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。 gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口相对坐标,不过它们不是整数,小数部分恒为0.5。x - 0.5和y - 0.5分别位于[0, windowWidth - 1]和[0, windowHeight - 1]内。windowWidth和windowHeight都...
gl_FragCoord和gl_FragDepth分别是片元着色器的输入和输出变量。 gl_FragCoord是个vec4,四个分量分别对应x, y, z和1/w。其中,x和y是当前片元的窗口相对坐标,不过它们不是整数,小数部分恒为0.5。x - 0.5和y - 0.5分别位于[0, windowWidth - 1]和[0, windowHeight - 1]内。windowWidth和windowHeight都...
GLSL提供给我们一个叫做gl_FragDepth的输出变量,我们可以使用它来在着色器内设置片段的深度值。 然而,在片段着色器中对gl_FragDepth进行写入,OpenGL就会(像深度测试小节中讨论的那样)禁用所有的提前深度测试(Early Depth Testing)。 从OpenGL 4.2起,我们仍可以对两者进行一定的调和,在片段着色器的顶部使用深度条件(Dep...
gl_FragDepth,这个稍微复杂点,可以用来修改片段的Z坐标,即深度值,如果没有设置gl_FragDepth,默认的回取gl_FragCoord.z。 gl_FragDepth有个缺陷,会导致提前深度测试冲突禁用,原理很好理解,因为只要到真正片段着色器运行才知道实际的深度值,提前深度测试没有意义。从4.2版本开始有个折中的方案,定义gl_FragDepth变量的...
gl_FragDepth = 0.0; 如果着色器没有给gl_FragDepth写入任何值,变量将会从gl_FragCoord.z获取值。 但手动设置深度值有一个缺点,这是因为OpenGL在我们写入gl_FragDepth时会关闭提前深度测试。之所以会关闭是因为在运行片元着色器前OpenGL将无法得知片段的深度是什么。
gl_FragDepth 输入变量gl_FragCoord能让我们读取当前片段的窗口空间坐标,并获取它的深度值,但是它是一个只读(Read-only)变量。我们不能修改片段的窗口空间坐标,但实际上修改片段的深度值还是可能的。GLSL提供给我们一个叫做gl_FragDepth的输出变量,我们可以使用它来在着色器内设置片段的深度值。