Я нахожусь перед очень странной проблемой, которая, кажется, происходит из простого умножения в фрагментном шейдере
Я пытаюсь вычислить тени, используя кадровый буфер, который визуализирует только глубины с «точки зрения света», что является обычной техникой для начинающих, которую легче внедрить
Фрагмент шейдера:
#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;
}
Можете ли вы обнаружить какую-либо логическую ошибку? Я использую унифицированные буферы массива, так как позже мне понадобится несколько источников света одновременно
Через некоторое время, пытаясь визуально отладить вывод шейдера, я, наконец, нашел ошибку, неправильно привязал текстуру карты глубины карты, и это вызвало странное поведение, которое я видел в последнем умножении
Извлеченный урок: это не всегда ошибка фрагмента
Других решений пока нет …