我正在编写OpenGL ES 2.0游戏(在iOS上)。如何创建一个着色器(因为我认为在着色器中这样做会更简单),以便远离原点的几何(在Z轴上)显得更暗?

此图像中的水说明了我所想到的效果

ios - 如何根据OpenGL ES 2.0的深度为它们着色?-LMLPHP
(来源:bytecellar.com)

最佳答案

如果您只想使用几何图形的Z位置,则这样做非常简单。您可以使用如下所示的顶点着色器:

attribute vec4 position;

varying float zDepth;

uniform mat4 modelViewProjMatrix;

void main()
{
    vec4 newPosition = modelViewProjMatrix * position;
    gl_Position = newPosition;
    zDepth = (2.0 - (1.0 + newPosition.z))/2.0;
}

和片段着色器
varying highp float zDepth;

void main()
{
    gl_FragColor = vec4(zDepth, zDepth, 0.0, 1.0);
}

这将产生以下外观:

我在为OpenGL ES 2.0类组装的this iPad sample code中有一个示例。

07-24 09:44