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无法在片...
根据GLSLangSpec.Full.1.30.08(p61),gl_FragCoord.z是固定功能计算所得的结果。如果片元着色器不写gl_FragDepth,那么这个值将用在后续处理中。OpenGL Shading Language提到(p104),即使将gl_FragCoord.z赋值给gl_FragDepth也不能保证产生和固定功能完全相同的值。但是,可以保证相对正确。加之片元着色器一旦写入gl_F...
OpenGL Shading Language提到(p104),即使将gl_FragCoord.z赋值给gl_FragDepth也不能保证产生和固定功能完全相同的值。但是,可以保证相对正确。加之片元着色器一旦写入gl_FragDepth,就必须保证在每个分支都有写入。因此,如果一个着色器需要在某些条件下自己计算深度,其它条件下的正确做法就是gl_FragDepth = gl_FragCoo...
我们用0-1的值设置gl_FragDepth: gl_FragDepth = 0.0; 如果着色器没有给gl_FragDepth写入任何值,变量将会从gl_FragCoord.z获取值。 但手动设置深度值有一个缺点,这是因为OpenGL在我们写入gl_FragDepth时会关闭提前深度测试。之所以会关闭是因为在运行片元着色器前OpenGL将无法得知片段的...
gl_FragDepth,这个稍微复杂点,可以用来修改片段的Z坐标,即深度值,如果没有设置gl_FragDepth,默认的回取gl_FragCoord.z。 gl_FragDepth有个缺陷,会导致提前深度测试冲突禁用,原理很好理解,因为只要到真正片段着色器运行才知道实际的深度值,提前深度测试没有意义。从4.2版本开始有个折中的方案,定义gl_FragDepth变量的...
gl_FragDepth:一个只写输出变量,在片段着色器写入时,覆盖片段的固定功能深度值,尽量减少手动实现深度值的写入。这个功能需要谨慎使用,因为它可能禁用许多GPU的深度优化,例如,许多GPU都有”Early-Z”的功能,在执行片段 着色器之前进行深度测试,使用”Early-z”的好处就是不能通过深度测试的片段就不会被着色(从而降低...
gl_FragDepth = gl_FragCoord.z + 0.1; } 注意这个特性只在OpenGL 4.2版本或以上才提供。 接口块 到目前为止,每当我们希望从顶点着色器向片段着色器发送数据时,我们都声明了几个对应的输入/输出变量。将它们一个一个声明是着色器间发送数据最简单的方式了,但当程序变得更大时,你希望发送的可能就不只是几个变...
输入变量gl_FragCoord能让我们读取当前片段的窗口空间坐标,并获取它的深度值,但是它是一个只读(Read-only)变量。我们不能修改片段的窗口空间坐标,但实际上修改片段的深度值还是可能的。GLSL提供给我们一个叫做gl_FragDepth的输出变量,我们可以使用它来在着色器内设置片段的深度值。
(4).gl_FragDepth :其实这个变量是只写的。表示每一个片元的深度值。就是说,在片元着色器中写入它时,它会覆盖片元的功能深度值。但是我们应该尽量减少手动的写入深度值,因为这样可能会使GPU禁用许多深度值的优化。 2. 片元着色器的内建常量 和顶点着色器一样,片元着色器的内建常量也都是const修饰的,不可...