Compare commits

..

No commits in common. "master" and "v0.2" have entirely different histories.
master ... v0.2

2 changed files with 5 additions and 19 deletions

View File

@ -27,16 +27,14 @@ layout(std140, binding = 3) uniform Sun
{ {
vec3 direction; vec3 direction;
vec3 color; vec3 color;
mat4 vp[4]; mat4 vp;
} sun; } sun;
uniform float camera_cascade_distances[4]; // Размер массива должен соответствовать количеству каскадов
uniform sampler2D gPosition; uniform sampler2D gPosition;
uniform sampler2D gNormal; uniform sampler2D gNormal;
uniform sampler2D gDiffuseP; uniform sampler2D gDiffuseP;
uniform sampler2D gAmbientSpecular; uniform sampler2D gAmbientSpecular;
uniform sampler2DArray sunShadowDepth; uniform sampler2D sunShadowDepth;
out vec4 color; out vec4 color;
@ -62,18 +60,10 @@ void main()
float intensity; // Интенсивность для прожектора float intensity; // Интенсивность для прожектора
vec3 fragPosLightSpace; // Фрагмент в пространстве источника vec3 fragPosLightSpace; // Фрагмент в пространстве источника
float shadowValue; // Значение затененности float shadowValue; // Значение затененности
vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0).xy; // Размер текселя текстуры теней vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0); // Размер текселя текстуры теней
int x, y; // Счетчик для PCF int x, y; // Счетчик для PCF
float pcfDepth; // Глубина PCF float pcfDepth; // Глубина PCF
vec4 fragPosCamSpace = camera.view * vec4(fragPos, 1); // Фрагмент в пространстве камеры
int cascade_index; // Индекс текущего каскада для вычисления теней
// Определение индекса каскада в который попадает фрагмент (цикл на 1 меньше чем кол-во каскадов)
for (cascade_index = 0; cascade_index < 3; cascade_index++)
if (abs(fragPosCamSpace.z) < camera_cascade_distances[cascade_index])
break;
// Фоновая освещенность // Фоновая освещенность
color = vec4(ka, 1); color = vec4(ka, 1);
@ -81,7 +71,7 @@ void main()
if (length(sun.color) > 0) if (length(sun.color) > 0)
{ {
// Расположение фрагмента в координатах теневой карты // Расположение фрагмента в координатах теневой карты
fragPosLightSpace = (sun.vp[cascade_index] * vec4(fragPos, 1.0)).xyz; fragPosLightSpace = (sun.vp * vec4(fragPos, 1.0)).xyz;
// Переход от [-1;1] к [0;1] // Переход от [-1;1] к [0;1]
fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2;
// Сдвиг для решения проблемы акне // Сдвиг для решения проблемы акне
@ -92,7 +82,7 @@ void main()
{ {
for(y = -1; y <= 1; ++y) for(y = -1; y <= 1; ++y)
{ {
pcfDepth = texture(sunShadowDepth, vec3(fragPosLightSpace.xy + vec2(x, y) * texelSize, cascade_index)).r; pcfDepth = texture(sunShadowDepth, fragPosLightSpace.xy + vec2(x, y) * texelSize).r;
shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0; shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0;
} }
} }

View File

@ -182,8 +182,6 @@ int main(void)
lightShader.link(); lightShader.link();
const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular", "sunShadowDepth"}; const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular", "sunShadowDepth"};
lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*));
// Загрузка данных о границах каскадов
glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]);
glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f} glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f}
, {-1.0f, -1.0f, 0.0f} , {-1.0f, -1.0f, 0.0f}
@ -218,8 +216,6 @@ int main(void)
ShaderProgram sunShadowShader; ShaderProgram sunShadowShader;
// Загрузим шейдер // Загрузим шейдер
sunShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert"); sunShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert");
sunShadowShader.load(GL_GEOMETRY_SHADER, "shaders/sun_shadow.geom");
sunShadowShader.load(GL_FRAGMENT_SHADER, "shaders/empty.frag");
sunShadowShader.link(); sunShadowShader.link();
// Модель прямоугольника // Модель прямоугольника