Как я могу раскрасить вещи в OpenGL ES 2.0 в зависимости от их глубины? - PullRequest
6 голосов
/ 21 февраля 2012

Я пишу игру OpenGL ES 2.0 (для iOS).Как я могу создать шейдер (так как я предполагаю, что это будет проще сделать в шейдере), чтобы геометрия дальше от начала координат (по оси Z) казалась темнее?

Вода на этом изображении иллюстрирует эффект, который я имею в виду

Zarch http://www.bytecellar.com/wp-content/uploads/2010/12/Zarch_screen.png

Ответы [ 2 ]

8 голосов
/ 21 февраля 2012

Это довольно просто сделать, если вы просто хотите использовать положение 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);
}

, который бы выглядел следующим образом:

Depth-shaded OpenGL teapot

У меня есть пример этого в этом примере кода iPad , который я собрал для своего класса OpenGL ES 2.0.

0 голосов
/ 22 октября 2013

Я провел довольно интересный тест, предоставленный @brad. Я просто изменил строку:

gl_FragColor = vec4(1.0, 1.0, 0.0, zDepth);

Ничего не случится с альфой. Это я или там что-то еще не хватает как для Alpha?

...