теневое отображение opengl glsl шейдер графика математика

у меня возникают трудности с пониманием математики между различными этапами шейдера.

в шейдере фрагмента с точки зрения освещения я в основном записываю 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);

для нижнего левого угла. аналогичный код для других углов

из решения я ожидаю, что сцена будет отображаться с точки зрения камеры с точно таким же цветом, как и с точки зрения освещения. возможно, с некоторой погрешностью в точности.


person ColacX    schedule 31.12.2012    source источник


Ответы (1)


Я сам разобрался с наложением текстур. бит значения глубины все еще немного странный. преобразуйте screenProjectedCoords в normalizedDeviceCoords, затем добавьте 1 деление на 2.

vec4 textureNormalizedCoords(vec4 screenProjected)
{
    vec3 normalizedDeviceCoords = (screenProjected.xyz / screenProjected.w);
    return vec4( (normalizedDeviceCoords.xy + 1.0) / 2.0, screenProjected.z * 0.005, 1/screenProjected.w);
}

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_lightTextureCoords = textureNormalizedCoords(p1_lightPV * llWorldPosition);
    EmitVertex();a
person ColacX    schedule 06.01.2013