Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | 698ad941f5 | |
Ковалев Роман Евгеньевич | ebbfe32c1f |
|
@ -27,14 +27,16 @@ layout(std140, binding = 3) uniform Sun
|
||||||
{
|
{
|
||||||
vec3 direction;
|
vec3 direction;
|
||||||
vec3 color;
|
vec3 color;
|
||||||
mat4 vp;
|
mat4 vp[4];
|
||||||
} 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 sampler2D sunShadowDepth;
|
uniform sampler2DArray sunShadowDepth;
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
|
@ -60,10 +62,18 @@ void main()
|
||||||
float intensity; // Интенсивность для прожектора
|
float intensity; // Интенсивность для прожектора
|
||||||
vec3 fragPosLightSpace; // Фрагмент в пространстве источника
|
vec3 fragPosLightSpace; // Фрагмент в пространстве источника
|
||||||
float shadowValue; // Значение затененности
|
float shadowValue; // Значение затененности
|
||||||
vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0); // Размер текселя текстуры теней
|
vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0).xy; // Размер текселя текстуры теней
|
||||||
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);
|
||||||
|
|
||||||
|
@ -71,7 +81,7 @@ void main()
|
||||||
if (length(sun.color) > 0)
|
if (length(sun.color) > 0)
|
||||||
{
|
{
|
||||||
// Расположение фрагмента в координатах теневой карты
|
// Расположение фрагмента в координатах теневой карты
|
||||||
fragPosLightSpace = (sun.vp * vec4(fragPos, 1.0)).xyz;
|
fragPosLightSpace = (sun.vp[cascade_index] * 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;
|
||||||
// Сдвиг для решения проблемы акне
|
// Сдвиг для решения проблемы акне
|
||||||
|
@ -82,7 +92,7 @@ void main()
|
||||||
{
|
{
|
||||||
for(y = -1; y <= 1; ++y)
|
for(y = -1; y <= 1; ++y)
|
||||||
{
|
{
|
||||||
pcfDepth = texture(sunShadowDepth, fragPosLightSpace.xy + vec2(x, y) * texelSize).r;
|
pcfDepth = texture(sunShadowDepth, vec3(fragPosLightSpace.xy + vec2(x, y) * texelSize, cascade_index)).r;
|
||||||
shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0;
|
shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,8 @@ 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}
|
||||||
|
@ -216,6 +218,8 @@ 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();
|
||||||
|
|
||||||
// Модель прямоугольника
|
// Модель прямоугольника
|
||||||
|
|
Loading…
Reference in New Issue