Compare commits
8 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | d3f8032488 | |
Ковалев Роман Евгеньевич | 2f075a14ef | |
Ковалев Роман Евгеньевич | 5945ceb269 | |
Ковалев Роман Евгеньевич | b2316eeb31 | |
Ковалев Роман Евгеньевич | a87e8b43bf | |
Ковалев Роман Евгеньевич | 5c88cabf7e | |
Ковалев Роман Евгеньевич | f94d55aaf4 | |
Ковалев Роман Евгеньевич | 60e3f8a1d9 |
|
@ -21,6 +21,15 @@
|
||||||
// Стандартная чувствительность
|
// Стандартная чувствительность
|
||||||
#define CAMERA_DEFAULT_SENSIVITY 0.005f
|
#define CAMERA_DEFAULT_SENSIVITY 0.005f
|
||||||
|
|
||||||
|
// Данные о камере для шейдера
|
||||||
|
struct CameraData
|
||||||
|
{
|
||||||
|
glm::mat4 projection;
|
||||||
|
glm::mat4 view;
|
||||||
|
glm::vec3 position;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Класс камеры
|
||||||
class Camera : public Node
|
class Camera : public Node
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -43,6 +52,8 @@ class Camera : public Node
|
||||||
|
|
||||||
void use(); // Использование этой камеры как текущей
|
void use(); // Использование этой камеры как текущей
|
||||||
static Camera& current(); // Ссылка на текущую используемую камеру
|
static Camera& current(); // Ссылка на текущую используемую камеру
|
||||||
|
|
||||||
|
CameraData& getData(); // Данные о камере для шейдера
|
||||||
protected:
|
protected:
|
||||||
Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы
|
Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
#ifndef LIGHTS_H
|
||||||
|
#define LIGHTS_H
|
||||||
|
|
||||||
|
#include <GLM/glm.hpp>
|
||||||
|
|
||||||
|
// Точечный источник света
|
||||||
|
struct LightData
|
||||||
|
{
|
||||||
|
alignas(16) glm::vec3 position; // Позиция
|
||||||
|
alignas(16) glm::vec3 color; // Цвет
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LIGHTS_H
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
in vec2 texCoord;
|
in vec2 texCoord;
|
||||||
|
|
||||||
|
in vec3 Cam_vertex; // Позиция камеры относительно вершины
|
||||||
|
in vec3 L_vertex; // Позиция источника света относительно вершины
|
||||||
|
in vec3 N; // Нормаль
|
||||||
|
|
||||||
layout(std140, binding = 1) uniform Material
|
layout(std140, binding = 1) uniform Material
|
||||||
{
|
{
|
||||||
vec3 ka;
|
vec3 ka;
|
||||||
|
@ -10,6 +14,12 @@ layout(std140, binding = 1) uniform Material
|
||||||
float p;
|
float p;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
layout(std140, binding = 2) uniform Light
|
||||||
|
{
|
||||||
|
vec3 position;
|
||||||
|
vec3 color;
|
||||||
|
} light_f;
|
||||||
|
|
||||||
uniform sampler2D tex_diffuse;
|
uniform sampler2D tex_diffuse;
|
||||||
uniform sampler2D tex_ambient;
|
uniform sampler2D tex_ambient;
|
||||||
uniform sampler2D tex_specular;
|
uniform sampler2D tex_specular;
|
||||||
|
@ -18,6 +28,14 @@ out vec4 color;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
color = texture(tex_diffuse, texCoord);
|
// Диффузная составляющая
|
||||||
|
float diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0
|
||||||
|
|
||||||
|
// Вектор половины пути
|
||||||
|
vec3 H = normalize(L_vertex + Cam_vertex);
|
||||||
|
// Зеркальная составляющая
|
||||||
|
float specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p
|
||||||
|
|
||||||
|
color = vec4(light_f.color*ka, 1)*texture(tex_ambient, texCoord) + vec4(light_f.color*kd*diffuse, 1)*texture(tex_diffuse, texCoord) + vec4(light_f.color*ks*specular, 1)*texture(tex_specular, texCoord);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,14 +8,31 @@ layout(std140, binding = 0) uniform Camera
|
||||||
{
|
{
|
||||||
mat4 projection;
|
mat4 projection;
|
||||||
mat4 view;
|
mat4 view;
|
||||||
};
|
vec3 position;
|
||||||
|
} camera;
|
||||||
|
|
||||||
|
layout(std140, binding = 2) uniform Light
|
||||||
|
{
|
||||||
|
vec3 position;
|
||||||
|
vec3 color;
|
||||||
|
} light_v;
|
||||||
|
|
||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
|
|
||||||
out vec2 texCoord;
|
out vec2 texCoord;
|
||||||
|
|
||||||
|
out vec3 Cam_vertex; // Позиция камеры относительно вершины
|
||||||
|
out vec3 L_vertex; // Позиция источника света относительно вершины
|
||||||
|
out vec3 N; // Нормаль трансформированноая
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = projection * view * model * vec4(pos, 1.0);
|
vec4 P = model * vec4(pos, 1.0); // трансформация вершины
|
||||||
|
|
||||||
|
Cam_vertex = normalize(camera.position - P.xyz);
|
||||||
|
L_vertex = normalize(light_v.position - P.xyz);
|
||||||
|
N = normalize(mat3(model) * normals);
|
||||||
|
|
||||||
|
gl_Position = camera.projection * camera.view * P;
|
||||||
texCoord = inTexCoord;
|
texCoord = inTexCoord;
|
||||||
}
|
}
|
|
@ -181,3 +181,11 @@ Camera& Camera::current()
|
||||||
else
|
else
|
||||||
return *p_current;
|
return *p_current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Данные о камере для шейдера
|
||||||
|
CameraData& Camera::getData()
|
||||||
|
{
|
||||||
|
static CameraData data;
|
||||||
|
data = {getProjection(), getView(), position};
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
16
src/main.cpp
16
src/main.cpp
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "Scene.h"
|
#include "Scene.h"
|
||||||
#include "Shader.h"
|
#include "Shader.h"
|
||||||
|
#include "Lights.h"
|
||||||
|
|
||||||
#define WINDOW_WIDTH 800
|
#define WINDOW_WIDTH 800
|
||||||
#define WINDOW_HEIGHT 600
|
#define WINDOW_HEIGHT 600
|
||||||
|
@ -95,7 +96,9 @@ int main(void)
|
||||||
|
|
||||||
|
|
||||||
// Загрузка сцены из obj файла
|
// Загрузка сцены из obj файла
|
||||||
Scene scene = loadOBJtoScene("../resources/models/cubes.obj", "../resources/models/", "../resources/textures/");
|
Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/");
|
||||||
|
scene.root.e_scale() = glm::vec3(0.01);
|
||||||
|
scene.root.e_position().z = 1;
|
||||||
|
|
||||||
// Установка цвета очистки буфера цвета
|
// Установка цвета очистки буфера цвета
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
@ -103,9 +106,15 @@ int main(void)
|
||||||
// Расположение Uniform-переменной
|
// Расположение Uniform-переменной
|
||||||
GLuint model_uniform = base.getUniformLoc("model");
|
GLuint model_uniform = base.getUniformLoc("model");
|
||||||
|
|
||||||
|
// Источник света
|
||||||
|
LightData light = { {1.0f, 3.0f, 0.0f} // позиция
|
||||||
|
, {1.0f, 1.0f, 1.0f} // цвет
|
||||||
|
};
|
||||||
|
|
||||||
// Uniform-буферы
|
// Uniform-буферы
|
||||||
UBO cameraUB(sizeof(glm::mat4)*2, 0);
|
UBO cameraUB(sizeof(CameraData), 0);
|
||||||
UBO material_data(sizeof(Material), 1);
|
UBO material_data(sizeof(Material), 1);
|
||||||
|
UBO light_data(&light, sizeof(LightData), 2);
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap
|
||||||
|
|
||||||
|
@ -113,8 +122,7 @@ int main(void)
|
||||||
while(!glfwWindowShouldClose(window))
|
while(!glfwWindowShouldClose(window))
|
||||||
{
|
{
|
||||||
// Загрузка данных о камере
|
// Загрузка данных о камере
|
||||||
cameraUB.loadSub(&Camera::current().getProjection(), sizeof(glm::mat4), 0);
|
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
|
||||||
cameraUB.loadSub(&Camera::current().getView(), sizeof(glm::mat4), sizeof(glm::mat4));
|
|
||||||
|
|
||||||
// Очистка буфера цвета
|
// Очистка буфера цвета
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
Loading…
Reference in New Issue