Шейдеры для теней от точечных источников
This commit is contained in:
parent
ec44eebe2d
commit
254dbdd90e
|
@ -0,0 +1,17 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
in vec4 FragPos;
|
||||||
|
in vec3 lightPos;
|
||||||
|
in float radius;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Расстояние между источником и фрагментом
|
||||||
|
float lightDistance = length(FragPos.xyz - lightPos);
|
||||||
|
|
||||||
|
// Приведение к диапазону [0;1]
|
||||||
|
lightDistance = lightDistance / radius;
|
||||||
|
|
||||||
|
// Замена значения глубины
|
||||||
|
gl_FragDepth = lightDistance;
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
#version 420 core
|
||||||
|
layout (triangles, invocations = 6) in; // здесь invocations соответствует числу сторон кубической карты теней
|
||||||
|
layout (triangle_strip, max_vertices=18) out; // здесь max_vertices = 3 вершины * 6 вызовов на стороны куба
|
||||||
|
|
||||||
|
struct LightData
|
||||||
|
{
|
||||||
|
vec3 position;
|
||||||
|
vec3 color;
|
||||||
|
vec3 attenuation;
|
||||||
|
vec4 direction_angle;
|
||||||
|
mat4 vp[6];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(std140, binding = 2) uniform Light
|
||||||
|
{
|
||||||
|
LightData data[64];
|
||||||
|
int count;
|
||||||
|
} light_g;
|
||||||
|
|
||||||
|
uniform int light_i;
|
||||||
|
|
||||||
|
out vec4 FragPos;
|
||||||
|
out vec3 lightPos;
|
||||||
|
out float radius;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
FragPos = gl_in[i].gl_Position;
|
||||||
|
lightPos = light_g.data[light_i].position;
|
||||||
|
radius = light_g.data[light_i].attenuation.r;
|
||||||
|
gl_Position = light_g.data[light_i].vp[gl_InvocationID] * gl_in[i].gl_Position;
|
||||||
|
gl_Layer = gl_InvocationID + light_i*6;
|
||||||
|
EmitVertex();
|
||||||
|
}
|
||||||
|
EndPrimitive();
|
||||||
|
}
|
|
@ -234,6 +234,14 @@ int main(void)
|
||||||
// Активируем базовый буфер кадра
|
// Активируем базовый буфер кадра
|
||||||
FBO::useDefault();
|
FBO::useDefault();
|
||||||
|
|
||||||
|
// Шейдер для расчета теней от точечных источников
|
||||||
|
ShaderProgram pointShadowShader;
|
||||||
|
// Загрузим шейдер
|
||||||
|
pointShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert");
|
||||||
|
pointShadowShader.load(GL_GEOMETRY_SHADER, "shaders/point_shadow.geom");
|
||||||
|
pointShadowShader.load(GL_FRAGMENT_SHADER, "shaders/point_shadow.frag");
|
||||||
|
pointShadowShader.link();
|
||||||
|
|
||||||
// Модель прямоугольника
|
// Модель прямоугольника
|
||||||
Model rectangle;
|
Model rectangle;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue