у меня возникают трудности с пониманием математики между различными этапами шейдера.
в шейдере фрагмента с точки зрения освещения я в основном записываю fragDepth в цвет rgb
#version 330
out vec4 shader_fragmentColor;
void main()
{
shader_fragmentColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1);
//shader_fragmentColor = vec4(1, 0.5, 0.5, 1);
}
при рендеринге сцены с использованием вышеуказанного шейдера она отображает сцену полностью белым цветом. Я полагаю, это потому, что gl_FragCoord.z больше 1. Надеюсь, он не исчерпан до 1. но пока мы можем оставить этот вопрос в покое.
в геометрическом шейдере с точки зрения камеры я в основном превращаю все точки в четырехугольники и записываю, возможно, «неправильную» позицию текстуры для поиска в lightTexture. математика вот в чем вопрос. я также немного не уверен, будет ли значение интерполяции правильным на следующем этапе шейдера.
#version 330
#extension GL_EXT_geometry_shader4 : enable
uniform mat4 p1_modelM;
uniform mat4 p1_cameraPV;
uniform mat4 p1_lightPV;
out vec4 shader_lightTexturePosition;
void main()
{
float s = 10.00;
vec4 llCorner = vec4(-s, -s, 0.0, 0.0);
vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position);
gl_Position = p1_cameraPV * llWorldPosition;
shader_lightTexturePosition = p1_lightPV * llWorldPosition;
EmitVertex();
vec4 rlCorner = vec4(+s, -s, 0.0, 0.0);
vec4 rlWorldPosition = ((p1_modelM * rlCorner) + gl_in[0].gl_Position);
gl_Position = p1_cameraPV * rlWorldPosition;
shader_lightTexturePosition = p1_lightPV * rlWorldPosition;
EmitVertex();
vec4 luCorner = vec4(-s, +s, 0.0, 0.0);
vec4 luWorldPosition = ((p1_modelM * luCorner) + gl_in[0].gl_Position);
gl_Position = p1_cameraPV * luWorldPosition;
shader_lightTexturePosition = p1_lightPV * luWorldPosition;
EmitVertex();
vec4 ruCorner = vec4(+s, +s, 0.0, 0.0);
vec4 ruWorldPosition = ((p1_modelM * ruCorner) + gl_in[0].gl_Position);
gl_Position = p1_cameraPV * ruWorldPosition;
shader_lightTexturePosition = p1_lightPV * ruWorldPosition;
EmitVertex();
EndPrimitive();
}
во фрагментном шейдере с точки зрения камеры я в основном ищу в lightTexture, какой цвет будет отображаться с точки зрения источников света, и записываю тот же цвет.
#version 330
uniform sampler2D p1_lightTexture;
in vec4 shader_lightTexturePosition;
out vec4 shader_fragmentColor;
void main()
{
vec4 lightTexel = texture2D(p1_lightTexture, shader_lightTexturePosition.xy);
shader_fragmentColor = lightTexel;
/*
if(lightTexel.x < shader_lightTexturePosition.z)
shader_fragmentColor = vec4(1, 0, 0, 1);
else
shader_fragmentColor = vec4(0, 1, 0, 1);
*/
//shader_fragmentColor = vec4(1, 1, 1, 1);
}
при рендеринге с точки зрения камеры я вижу, что сцена нарисована так, как должна, но с нанесенными на них неправильными координатами текстуры, которые повторяются. повторяющаяся текстура, вероятно, вызвана тем, что координата текстуры находится за пределами границ от 0 до 1.
Я пробовал несколько вещей, но до сих пор не понимаю, какой должна быть математика. некоторые из прокомментированных кодов и один пример, в котором я не уверен:
shader_lightTexturePosition = normalize(p1_lightPV * llWorldPosition) / 2 + vec4(0.5, 0.5, 0.5, 0.5);
для нижнего левого угла. аналогичный код для других углов
из решения я ожидаю, что сцена будет отображаться с точки зрения камеры с точно таким же цветом, как и с точки зрения освещения. возможно, с некоторой погрешностью в точности.