GLSL теневое умножение не работает

Я нахожусь перед очень странной проблемой, которая, кажется, происходит из простого умножения в фрагментном шейдере

Я пытаюсь вычислить тени, используя кадровый буфер, который визуализирует только глубины с «точки зрения света», что является обычной техникой для начинающих, которую легче внедрить

Фрагмент шейдера:

#version 330 core

uniform sampler2D   parquet;
uniform samplerCube depthMaps[15];

in vec2 TexCoords;

out vec4 color;
in vec3 Normal;
in vec3 FragPos;

uniform vec3  lightPos[15];
uniform vec3  lightColor[15];
uniform float intensity[15];

uniform float far_plane;
uniform vec3 viewPos;float ShadowCalculation(vec3 fragPos, vec3 lightPost, samplerCube depthMaps)
{
vec3 fragToLight = fragPos - lightPost;
float closestDepth = texture(depthMaps, fragToLight).r;
// original depth value
closestDepth *= far_plane;
float currentDepth = length(fragToLight);
float bias = 0.05;
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;

return shadow;
}void main()
{
vec3 norm = normalize(Normal);

vec3 lightDir = normalize(lightPos[0] - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor[0];

float _distance = length(vec3(FragPos - lightPos[0]));
float attenuation =  1.0 / pow(_distance +1, 2);
if(attenuation > 1.0)  attenuation = 1.0;

float intens = intensity[0];
if(intensity[0] > 150) intens = 150.0f;

vec3 resulta = (diffuse * attenuation) * intens;

//texture color
vec3 tCol = vec3(texture(parquet, TexCoords));
//gamma correction
tCol.rgb = pow(tCol.rgb, vec3(0.45));

vec3 colors = resulta * tCol * (1.0f - ShadowCalculation(FragPos, lightPos[0],  depthMaps[0]));

color = vec4(colors, 1.0f);
}

Последнее умножение внутри main () ведет себя странно, умножая результат рассеянного света на цвет текстуры, мы получаем хорошие результаты (поэтому у нас нет теней, только рассеянная молния)

//works
vec3 colors = resulta * tCol;

Умножение рассеянного света на результаты теней также хорошо выглядит (теперь у нас нет текстур)

//works
vec3 colors = resulta * (1.0f - ShadowCalculation(FragPos, lightPos[0],  depthMaps[0]));

Делая все вместе, выдает только черный экран. Я пробовал все что угодно в фрагментном шейдере, но ничего не получалось.

Наконец, вот фрагментный шейдер, используемый для визуализации кубической карты:

#version 330 core
in vec4 FragPos;
uniform vec3 lightPos;
uniform float far_plane;

void main()
{
float lightDistance = length(FragPos.xyz - lightPos);
// map to [0;1] range by dividing by far_plane
lightDistance = lightDistance / far_plane;
gl_FragDepth = lightDistance;
}

Можете ли вы обнаружить какую-либо логическую ошибку? Я использую унифицированные буферы массива, так как позже мне понадобится несколько источников света одновременно

0

Решение

Через некоторое время, пытаясь визуально отладить вывод шейдера, я, наконец, нашел ошибку, неправильно привязал текстуру карты глубины карты, и это вызвало странное поведение, которое я видел в последнем умножении

Извлеченный урок: это не всегда ошибка фрагмента

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]