1

我刚刚开始使用片段着色器,在完成了一些简单的等离子效果之后,我就卡住了。我已经知道您可以检索片段的 X、Y 和 Z,并且我正在考虑构建一个着色器,该着色器将根据片段的 Z 为片段着色。

这是我到目前为止所拥有的:

void main() {
    float z = gl_FragCoord.z;
    float t = (sin(z) + 1) * 0.5;

    gl_FragColor = vec4(t, t, t, 1);
}

问题是我正在用一个三角形测试它,无论我如何旋转它,它都有相同的恒定颜色,所以我开始问自己(并且在 SO):为什么三角形是单一颜色的?这个 Z 不应该是每个片段吗?

4

1 回答 1

2

gl_FragCoord 中的 z 坐标在 0 和 1 之间进行归一化(其中 0 对应于近平面,1 对应于远平面)。使用透视投影,这种映射是非线性的,有利于近平面。这意味着即使在旋转时,您的三角形也可能会映射到相同的颜色。

值得指出的是,您的总体想法很好(在我的 GLSL 着色器编辑器中创建):http: //goo.gl/32Voo

请注意,我在这里使用正交投影来获得更好的深度可视化 - 切换到投影使颜色几乎相同(仅变化几个百分比)。

于 2012-10-21T12:47:29.443 回答