Пример использования UBO
This commit is contained in:
		
							parent
							
								
									54d4301e5f
								
							
						
					
					
						commit
						48d8b47a88
					
				| @ -31,7 +31,7 @@ class Model : public Movable | |||||||
|         Model(); // Конструктор без параметров
 |         Model(); // Конструктор без параметров
 | ||||||
|         Model(const Model& copy); // Конструктор копирования
 |         Model(const Model& copy); // Конструктор копирования
 | ||||||
|         ~Model(); |         ~Model(); | ||||||
|         void render(const GLuint &mvp_uniform); // Вызов отрисовки
 |         void render(const GLuint &model_uniform); // Вызов отрисовки
 | ||||||
|         void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
 |         void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
 | ||||||
|         void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер
 |         void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер
 | ||||||
|         void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер
 |         void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер
 | ||||||
| @ -52,7 +52,7 @@ class Model : public Movable | |||||||
| class GrouptedModel: public Movable | class GrouptedModel: public Movable | ||||||
| { | { | ||||||
|     public: |     public: | ||||||
|         void render(const GLuint &mvp_uniform); // Вызов отрисовки
 |         void render(const GLuint &model_uniform); // Вызов отрисовки
 | ||||||
|         std::vector<Model> parts; |         std::vector<Model> parts; | ||||||
| 
 | 
 | ||||||
|         Model& operator[](int index); // Оператор[i] для простого доступа к частям модели
 |         Model& operator[](int index); // Оператор[i] для простого доступа к частям модели
 | ||||||
|  | |||||||
| @ -1,15 +1,21 @@ | |||||||
| #version 330 core  | #version 420 core  | ||||||
| 
 | 
 | ||||||
| layout(location = 0) in vec3 pos;  | layout(location = 0) in vec3 pos;  | ||||||
| layout(location = 1) in vec2 inTexCoord; | layout(location = 1) in vec2 inTexCoord; | ||||||
| layout(location = 2) in vec3 normals;  | layout(location = 2) in vec3 normals;  | ||||||
| 
 | 
 | ||||||
| uniform mat4 mvp; | layout(std140, binding = 0) uniform Camera | ||||||
|  | { | ||||||
|  |     mat4 projection; | ||||||
|  |     mat4 view; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | uniform mat4 model; | ||||||
| 
 | 
 | ||||||
| out vec2 texCoord; | out vec2 texCoord; | ||||||
| 
 | 
 | ||||||
| void main()  | void main()  | ||||||
| {  | {  | ||||||
|     gl_Position = mvp * vec4(pos, 1.0); |     gl_Position = projection * view * model * vec4(pos, 1.0); | ||||||
|     texCoord = inTexCoord; |     texCoord = inTexCoord; | ||||||
| }  | }  | ||||||
|  | |||||||
| @ -29,11 +29,11 @@ Model::~Model() | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Вызов отрисовки
 | // Вызов отрисовки
 | ||||||
| void Model::render(const GLuint &mvp_uniform)  | void Model::render(const GLuint &model_uniform)  | ||||||
| { | { | ||||||
|     // Расчитаем матрицу трансформации
 |     // Расчитаем матрицу трансформации
 | ||||||
|     glm::mat4 mvp = camera.getVP() * this->getTransformMatrix(); |     glm::mat4 model = this->getTransformMatrix(); | ||||||
|     glUniformMatrix4fv(mvp_uniform, 1, GL_FALSE, &mvp[0][0]); |     glUniformMatrix4fv(model_uniform, 1, GL_FALSE, &model[0][0]); | ||||||
| 
 | 
 | ||||||
|     // Подключаем текстуры
 |     // Подключаем текстуры
 | ||||||
|     texture_diffuse.use(); |     texture_diffuse.use(); | ||||||
| @ -309,14 +309,14 @@ GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Вызов отрисовки групповой модели
 | // Вызов отрисовки групповой модели
 | ||||||
| void GrouptedModel::render(const GLuint &mvp_uniform) | void GrouptedModel::render(const GLuint &model_uniform) | ||||||
| { | { | ||||||
|     for (auto& model : parts) |     for (auto& model : parts) | ||||||
|     { |     { | ||||||
|         model.position += position; |         model.position += position; | ||||||
|         model.rotation += rotation; |         model.rotation += rotation; | ||||||
|         model.scale *= scale; |         model.scale *= scale; | ||||||
|         model.render(mvp_uniform); |         model.render(model_uniform); | ||||||
|         model.position -= position; |         model.position -= position; | ||||||
|         model.rotation -= rotation; |         model.rotation -= rotation; | ||||||
|         model.scale /= scale; |         model.scale /= scale; | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -196,7 +196,10 @@ int main(void) | |||||||
|     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); | ||||||
| 
 | 
 | ||||||
|     // Расположение Uniform-переменной
 |     // Расположение Uniform-переменной
 | ||||||
|     GLuint mvp_uniform = glGetUniformLocation(shaderProgram, "mvp"); |     GLuint model_uniform = glGetUniformLocation(shaderProgram, "model"); | ||||||
|  | 
 | ||||||
|  |     // Uniform-буферы
 | ||||||
|  |     UBO cameraUB(sizeof(glm::mat4)*2, 0); | ||||||
| 
 | 
 | ||||||
|     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap  
 |     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap  
 | ||||||
| 
 | 
 | ||||||
| @ -206,8 +209,12 @@ 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.getView(), sizeof(glm::mat4), sizeof(glm::mat4)); | ||||||
|  | 
 | ||||||
|         // Тут производится рендер
 |         // Тут производится рендер
 | ||||||
|         scene.render(mvp_uniform); |         scene.render(model_uniform); | ||||||
| 
 | 
 | ||||||
|         // Представление содержимого буфера цепочки показа на окно
 |         // Представление содержимого буфера цепочки показа на окно
 | ||||||
|         glfwSwapBuffers(window); |         glfwSwapBuffers(window); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user