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

This commit is contained in:
parent f94d55aaf4
commit 5c88cabf7e
4 changed files with 24 additions and 5 deletions

View File

@ -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) конструктор камеры без перспективы

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

@ -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;
}

View File

@ -112,7 +112,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(LightData), 2); UBO light_data(&light, sizeof(LightData), 2);
@ -122,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);