diff --git a/include/Camera.h b/include/Camera.h index 3357cba..5939267 100644 --- a/include/Camera.h +++ b/include/Camera.h @@ -12,6 +12,13 @@ // Стандартный угол обзора #define CAMERA_FOVy 60.0f +struct CameraData +{ + glm::mat4 projection; + glm::mat4 view; + glm::vec3 position; +}; + class Camera { public: @@ -28,6 +35,7 @@ class Camera void setPerspective(float fov, float aspect); // Устанавливает заданную матрицу перспективы void setOrtho(float width, float height); // Устанавливает заданную ортографическую матрицу void setSensitivity(float sensitivity); // Изменяет чувствительность мыши + CameraData& getData(); // Данные о камере для шейдера protected: Camera(const glm::vec3 &position, const glm::vec2 &xyOffset); // Защищенный (protected) констуктор камеры без перспективы void recalcTarget(); // Пересчет цели, на которую смотрит камера 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 d1f6431..ab0e80e 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -139,3 +139,11 @@ void Camera::setSensitivity(float sens) { sensitivity = sens; } + +// Данные о камере для шейдера +CameraData& Camera::getData() +{ + static CameraData data; + data = {getProjection(), getView(), position}; + return data; +} diff --git a/src/main.cpp b/src/main.cpp index ad67050..90bb44b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -115,7 +115,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(PointLight), 2); @@ -128,8 +128,7 @@ int main(void) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Загрузка данных о камере - cameraUB.loadSub(&camera.getProjection(), sizeof(glm::mat4), 0); - cameraUB.loadSub(&camera.getView(), sizeof(glm::mat4), sizeof(glm::mat4)); + cameraUB.loadSub(&camera.getData(), sizeof(CameraData)); // Тут производится рендер scene.render(model_uniform, material_data);