Переделка камеры

This commit is contained in:
Ковалев Роман Евгеньевич 2022-11-23 14:14:20 +03:00 committed by R.E. Kovalev
parent 4901238b21
commit 15bbb9e349
4 changed files with 21 additions and 5 deletions

View File

@ -12,6 +12,13 @@
// Стандартный угол обзора // Стандартный угол обзора
#define CAMERA_FOVy 60.0f #define CAMERA_FOVy 60.0f
struct CameraData
{
glm::mat4 projection;
glm::mat4 view;
glm::vec3 position;
};
class Camera class Camera
{ {
public: public:
@ -28,6 +35,7 @@ class Camera
void setPerspective(float fov, float aspect); // Устанавливает заданную матрицу перспективы void setPerspective(float fov, float aspect); // Устанавливает заданную матрицу перспективы
void setOrtho(float width, float height); // Устанавливает заданную ортографическую матрицу void setOrtho(float width, float height); // Устанавливает заданную ортографическую матрицу
void setSensitivity(float sensitivity); // Изменяет чувствительность мыши void setSensitivity(float sensitivity); // Изменяет чувствительность мыши
CameraData& getData(); // Данные о камере для шейдера
protected: protected:
Camera(const glm::vec3 &position, const glm::vec2 &xyOffset); // Защищенный (protected) констуктор камеры без перспективы Camera(const glm::vec3 &position, const glm::vec2 &xyOffset); // Защищенный (protected) констуктор камеры без перспективы
void recalcTarget(); // Пересчет цели, на которую смотрит камера void recalcTarget(); // Пересчет цели, на которую смотрит камера

View File

@ -8,7 +8,8 @@ layout(std140, binding = 0) uniform Camera
{ {
mat4 projection; mat4 projection;
mat4 view; mat4 view;
}; vec3 position;
} camera;
layout(std140, binding = 2) uniform Light layout(std140, binding = 2) uniform Light
{ {
@ -22,6 +23,6 @@ out vec2 texCoord;
void main() void main()
{ {
gl_Position = projection * view * model * vec4(pos, 1.0); gl_Position = camera.projection * camera.view * model * vec4(pos, 1.0);
texCoord = inTexCoord; texCoord = inTexCoord;
} }

View File

@ -139,3 +139,11 @@ void Camera::setSensitivity(float sens)
{ {
sensitivity = sens; sensitivity = sens;
} }
// Данные о камере для шейдера
CameraData& Camera::getData()
{
static CameraData data;
data = {getProjection(), getView(), position};
return data;
}

View File

@ -115,7 +115,7 @@ int main(void)
}; };
// 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(PointLight), 2); UBO light_data(&light, sizeof(PointLight), 2);
@ -128,8 +128,7 @@ int main(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Загрузка данных о камере // Загрузка данных о камере
cameraUB.loadSub(&camera.getProjection(), sizeof(glm::mat4), 0); cameraUB.loadSub(&camera.getData(), sizeof(CameraData));
cameraUB.loadSub(&camera.getView(), sizeof(glm::mat4), sizeof(glm::mat4));
// Тут производится рендер // Тут производится рендер
scene.render(model_uniform, material_data); scene.render(model_uniform, material_data);