GLSL передает координаты текстуры из вершинного шейдера - PullRequest
4 голосов
/ 16 октября 2011

Чего я пытаюсь достичь: рисуя карту глубины моей сцены поверх моей сцены (чтобы объекты ближе были темнее, а дальше светлее)

Проблема: мне кажется, я не понимаю, как передать правильные координаты текстуры из моего вершинного шейдера в мой фрагментный шейдер.

Итак, я создал свое FBO и текстуру, к которой рисуется карта глубины ... не то, чтобы я был полностью уверен в том, что я делал, но что угодно, это работает. Я протестировал рисование текстуры с использованием конвейера с фиксированной функциональностью, и оно выглядит так, как должно (карта глубины).

Но попытка использовать его в моих шейдерах просто не работает ...

Вот часть моего метода визуализации, которая связывает текстуру:

glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depthTextureId);
glUniform1i(depthMapUniform, 7);
glUseProgram(shaderProgram);
look();  //updates my viewing matrix
box.render();   //renders box VBO

Так что ... я думаю, что это правильно? Может быть? Понятия не имею, почему текстура 7, это было просто то, что было в учебнике, который я проверял ...

И вот что важно из моего вершинного шейдера:

out vec4 ShadowCoord;

void main() {
    gl_Position = PMatrix * (VMatrix * MMatrix) * gl_Vertex;  //projection, view and model matrices
    ShadowCoord = gl_MultiTexCoord0;    //something I kept seeing in examples, was hoping it would work.
}

Aaand, фрагментный шейдер:

in vec4 ShadowCoord;
in vec3 Color;  //passed from vertex shader, didn't include the code for it though. Just the vertex color.

out vec4 FragColor;

void main(
    FragColor = vec4(texture2D(ShadowMap,shadowCoord.st).x * vec3(Color), 1.0);

Теперь проблема в том, что координата, которую фрагментный шейдер получает для текстуры, всегда равна (0,0) или нижнему левому углу. Я попытался изменить его на ShadowCoord = gl_MultiTexCoord7, потому что я подумал, что, возможно, это как-то связано с тем, что я поместил текстуру в слот № 7 ... но, увы, проблема осталась. Когда изменяется цвет (0, 0), меняется и цвет всей сцены, а не меняется цвет только для соответствующего пикселя / фрагмента.

И это то, что я надеюсь получить некоторое представление о ... как передать правильные координаты (я хотел бы, чтобы углы текстуры были такими же координатами, что и углы моего экрана). И да, это вопрос для начинающих ... но я искал в «Оранжевой книге», и проблема с ним в том, что он хорош в аспекте GLSL, но в аспектах OpenGL остро не хватает примеров, которые Я мог бы действительно использовать ...

1 Ответ

4 голосов
/ 16 октября 2011

Входная переменная gl_MultiTexCoord0 (или 7) является встроенной текстурной координатой на вершину для 0-й (или 7-й) текстурной координаты, установленной gl(Multi)TexCoord (при использовании непосредственного режима) или glTexCoordPointer (при использованииarrays / VBOs).

Но поскольку ваш буфер глубины уже находится в пространстве экрана, вам нужна не обычная текстура, наложенная на объект, а просто значение в текстуре для определенного пикселя / фрагмента.Так что вершинный шейдер никак не задействован.Вместо этого вы просто используете позицию на экране текущего фрагмента в качестве координаты текстуры, которую можно прочитать в шейдере фрагмента, используя gl_FragCoord.Но имейте в виду, что эта координата находится в [0, w] x [0, h] и доступ к текстурам осуществляется через нормализованные текстурные координаты в [0,1].Таким образом, вам нужно разделить координату фрагмента на размер экрана:

uniform vec2 screenSize;
...
... texture2D(ShadowMap, gl_FragCoord.st/screenSize) ...

Но вам все равно не нужно два прохода для этого эффекта, так как вы можете просто использовать глубину фрагмента напрямую, безписать в текстуру.Вместо

texture2D(ShadowMap, gl_FragCoord.st/screenSize).x

вы можете просто использовать

gl_FragCoord.z

, который является ничем иным, как значением глубины фрагмента, которое было бы записано в текстуру при первом проходе.Таким образом вы полностью избавитесь от первого прохода глубинной записи и доступа к текстуре во втором проходе.

...