Compare commits

...

6 Commits
v0.3 ... master

5 changed files with 48 additions and 7 deletions

View File

@ -21,6 +21,15 @@
// Стандартная чувствительность
#define CAMERA_DEFAULT_SENSIVITY 0.005f
// Данные о камере для шейдера
struct CameraData
{
glm::mat4 projection;
glm::mat4 view;
glm::vec3 position;
};
// Класс камеры
class Camera : public Node
{
public:
@ -43,6 +52,8 @@ class Camera : public Node
void use(); // Использование этой камеры как текущей
static Camera& current(); // Ссылка на текущую используемую камеру
CameraData& getData(); // Данные о камере для шейдера
protected:
Camera(const glm::vec3 &position, const glm::vec3 &initialRotation); // Защищенный (protected) конструктор камеры без перспективы

View File

@ -2,6 +2,10 @@
in vec2 texCoord;
in vec3 Cam_vertex; // Позиция камеры относительно вершины
in vec3 L_vertex; // Позиция источника света относительно вершины
in vec3 N; // Нормаль
layout(std140, binding = 1) uniform Material
{
vec3 ka;
@ -24,6 +28,14 @@ out vec4 color;
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);
}

View File

@ -8,7 +8,8 @@ layout(std140, binding = 0) uniform Camera
{
mat4 projection;
mat4 view;
};
vec3 position;
} camera;
layout(std140, binding = 2) uniform Light
{
@ -20,8 +21,18 @@ uniform mat4 model;
out vec2 texCoord;
out vec3 Cam_vertex; // Позиция камеры относительно вершины
out vec3 L_vertex; // Позиция источника света относительно вершины
out vec3 N; // Нормаль трансформированноая
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;
}

View File

@ -181,3 +181,11 @@ Camera& Camera::current()
else
return *p_current;
}
// Данные о камере для шейдера
CameraData& Camera::getData()
{
static CameraData data;
data = {getProjection(), getView(), position};
return data;
}

View File

@ -112,7 +112,7 @@ int main(void)
};
// Uniform-буферы
UBO cameraUB(sizeof(glm::mat4)*2, 0);
UBO cameraUB(sizeof(CameraData), 0);
UBO material_data(sizeof(Material), 1);
UBO light_data(&light, sizeof(LightData), 2);
@ -122,8 +122,7 @@ int main(void)
while(!glfwWindowShouldClose(window))
{
// Загрузка данных о камере
cameraUB.loadSub(&Camera::current().getProjection(), sizeof(glm::mat4), 0);
cameraUB.loadSub(&Camera::current().getView(), sizeof(glm::mat4), sizeof(glm::mat4));
cameraUB.loadSub(&Camera::current().getData(), sizeof(CameraData));
// Очистка буфера цвета
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);