Параллельный источник
This commit is contained in:
parent
60aa8fea1f
commit
044731350e
@ -28,4 +28,14 @@ class Bulb
|
|||||||
static GrouptedModel bulb_model;
|
static GrouptedModel bulb_model;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Класс направленного источника освещения
|
||||||
|
class Sun
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Sun(const glm::vec3 &direction = glm::vec3(0.0f, -1.0f, 0.0f), const glm::vec3 &color = glm::vec3(0.4f, 0.4f, 0.4f));
|
||||||
|
alignas(16) glm::vec3 direction; // Направление лучей источника
|
||||||
|
alignas(16) glm::vec3 color; // Цвет
|
||||||
|
void upload(ShaderProgram &shaderProgram); // Загрузка данных об источнике на шейдер
|
||||||
|
};
|
||||||
|
|
||||||
#endif // LIGHTS_H
|
#endif // LIGHTS_H
|
||||||
|
@ -25,7 +25,8 @@ layout(std140, binding = 2) uniform Light
|
|||||||
int count;
|
int count;
|
||||||
} light_f;
|
} light_f;
|
||||||
|
|
||||||
|
uniform vec3 Sun_direction;
|
||||||
|
uniform vec3 Sun_color;
|
||||||
|
|
||||||
uniform sampler2D gPosition;
|
uniform sampler2D gPosition;
|
||||||
uniform sampler2D gNormal;
|
uniform sampler2D gNormal;
|
||||||
@ -58,6 +59,23 @@ void main()
|
|||||||
// Фоновая освещенность
|
// Фоновая освещенность
|
||||||
color = vec4(ka, 1);
|
color = vec4(ka, 1);
|
||||||
|
|
||||||
|
// Расчет солнца, если его цвет не черный
|
||||||
|
if (length(Sun_color) > 0)
|
||||||
|
{
|
||||||
|
// Данные об источнике относительно фрагмента
|
||||||
|
L_vertex = normalize(-Sun_direction);
|
||||||
|
// Диффузная составляющая
|
||||||
|
diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0
|
||||||
|
|
||||||
|
// Вектор половины пути
|
||||||
|
H = normalize(L_vertex + Cam_vertex);
|
||||||
|
// Зеркальная составляющая
|
||||||
|
specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p
|
||||||
|
// Результирующий цвет с учетом солнца
|
||||||
|
color += vec4(Sun_color*kd*diffuse, 1)
|
||||||
|
+ vec4(Sun_color*ks*specular, 1);
|
||||||
|
}
|
||||||
|
|
||||||
// Цикл по источникам света
|
// Цикл по источникам света
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < light_f.count; i++)
|
for (i = 0; i < light_f.count; i++)
|
||||||
|
@ -74,3 +74,20 @@ void Bulb::setRadius(float r)
|
|||||||
K[0] = 4.5/radius;
|
K[0] = 4.5/radius;
|
||||||
K[1] = 4 * K[0] * K[0];
|
K[1] = 4 * K[0] * K[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Конструктор направленного источника с параметрами направления и цвета
|
||||||
|
Sun::Sun(const glm::vec3 &dir, const glm::vec3 &c) : direction(dir), color(c)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Загрузка данных об источнике на шейдер
|
||||||
|
void Sun::upload(ShaderProgram &shaderProgram)
|
||||||
|
{
|
||||||
|
GLuint direction_uniform = shaderProgram.getUniformLoc("Sun_direction");
|
||||||
|
GLuint color_uniform = shaderProgram.getUniformLoc("Sun_color");
|
||||||
|
|
||||||
|
// Загрузим данные
|
||||||
|
glUniform3fv(direction_uniform, 1, &direction[0]);
|
||||||
|
glUniform3fv(color_uniform, 1, &color[0]);
|
||||||
|
}
|
||||||
|
@ -115,6 +115,9 @@ int main(void)
|
|||||||
bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag");
|
bulbShader.load(GL_FRAGMENT_SHADER, "shaders/bulb.frag");
|
||||||
bulbShader.link();
|
bulbShader.link();
|
||||||
|
|
||||||
|
// Направленный источник света
|
||||||
|
Sun sun;
|
||||||
|
|
||||||
// Источники света
|
// Источники света
|
||||||
Bulb lights[MAX_LIGHTS];
|
Bulb lights[MAX_LIGHTS];
|
||||||
// Количество используемых источников
|
// Количество используемых источников
|
||||||
@ -195,6 +198,8 @@ int main(void)
|
|||||||
gNormal.use();
|
gNormal.use();
|
||||||
gDiffuseP.use();
|
gDiffuseP.use();
|
||||||
gAmbientSpecular.use();
|
gAmbientSpecular.use();
|
||||||
|
// Загружаем информацию о направленном источнике
|
||||||
|
sun.upload(lightShader);
|
||||||
// Загружаем информацию об источниках света и их количестве
|
// Загружаем информацию об источниках света и их количестве
|
||||||
light_data.loadSub(lights, sizeof(Bulb) * lights_count);
|
light_data.loadSub(lights, sizeof(Bulb) * lights_count);
|
||||||
light_data.loadSub(&lights_count, sizeof(GLint), sizeof(lights));
|
light_data.loadSub(&lights_count, sizeof(GLint), sizeof(lights));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user