diff --git a/include/Camera.h b/include/Camera.h index 73840de..9f3e97e 100644 --- a/include/Camera.h +++ b/include/Camera.h @@ -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) конструктор камеры без перспективы diff --git a/shaders/shader.vert b/shaders/shader.vert index ae7a2b4..aca81ff 100644 --- a/shaders/shader.vert +++ b/shaders/shader.vert @@ -8,7 +8,8 @@ layout(std140, binding = 0) uniform Camera { mat4 projection; mat4 view; -}; + vec3 position; +} camera; layout(std140, binding = 2) uniform Light { @@ -22,6 +23,6 @@ out vec2 texCoord; void main() { - gl_Position = projection * view * model * vec4(pos, 1.0); + gl_Position = camera.projection * camera.view * model * vec4(pos, 1.0); texCoord = inTexCoord; } diff --git a/src/Camera.cpp b/src/Camera.cpp index 6fb0fb2..d2eb97f 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -181,3 +181,11 @@ Camera& Camera::current() else return *p_current; } + +// Данные о камере для шейдера +CameraData& Camera::getData() +{ + static CameraData data; + data = {getProjection(), getView(), position}; + return data; +} diff --git a/src/main.cpp b/src/main.cpp index 525800e..f1ae68d 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -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);