Move PVM matrix multiplication from vertex to tessellation eval shader

This commit is contained in:
Jack Christensen 2024-08-14 19:14:43 -04:00
parent b2450d4ca5
commit 136b5cab9c
3 changed files with 33 additions and 9 deletions

View File

@ -2,6 +2,14 @@
layout(quads, equal_spacing, ccw) in; // Define the type of patch (e.g., quads)
layout(location = 0) uniform mat4 M;
layout(std140, binding = 0) uniform SceneUniforms
{
mat4 PV; //camera projection * view matrix
vec4 eye_w; //world-space eye position
};
out vec3 frag_position; // Ensure this matches the input in fragment.glsl
void main()
@ -13,5 +21,5 @@ void main()
frag_position = pos;
gl_Position = vec4(pos, 1.0);
gl_Position = PV*M*vec4(pos, 1.0);
}

View File

@ -1,4 +1,11 @@
#version 430
layout(location = 0) uniform mat4 M;
layout(std140, binding = 0) uniform SceneUniforms
{
mat4 PV; //camera projection * view matrix
vec4 eye_w; //world-space eye position
};
layout(location = 0) in vec3 pos_attrib;
layout(location = 1) in vec2 tex_coord_attrib;

View File

@ -41,10 +41,11 @@ Scene::Scene(int width, int height)
quad_shader_program_(-1),
vao_(-1),
quad_vao_(-1),
angle_(0.0f),
angle_(-glm::pi<float>() / 2.0f),
scale_(1.0f),
aspect_(static_cast<float>(width) / static_cast<float>(height)),
near_z_(0.1f), far_z_(100.0f),
near_z_(0.01f),
far_z_(100.0f),
fov_(glm::pi<float>() / 4.0f)
{}
@ -80,11 +81,19 @@ void Scene::Init() {
void Scene::InitBuffers() {
GLuint patch_vbo;
// Quad vertices in 3D space
// float patchVertices[] = {
// -0.5f, 0.0f, -0.5f, // Bottom-left
// 0.5f, 0.0f, -0.5f, // Bottom-right
// 0.5f, 0.0f, 0.5f, // Top-right
// -0.5f, 0.0f, 0.5f // Top-left
// };
float patchVertices[] = {
-0.5f, -0.5f, 0.0f, // Bottom-left
0.5f, -0.5f, 0.0f, // Bottom-right
0.5f, 0.5f, 0.0f, // Top-right
-0.5f, 0.5f, 0.0f // Top-left
0.5f, 0.5f, 0.0f, // Top-right
-0.5f, 0.5f, 0.0f // Top-left
};
@ -152,20 +161,20 @@ void Scene::Display(GLFWwindow* window) {
glUseProgram(shader_program_);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
view_matrix_ = glm::lookAt(glm::vec3(Uniforms::SceneData.eye_w), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
view_matrix_ = glm::lookAt(glm::vec3(0.0f, 2.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
Uniforms::SceneData.PV = projection_matrix_ * view_matrix_; // Projection-View matrix
Uniforms::BufferSceneData();
glm::mat4 model_matrix = glm::rotate(angle_, glm::vec3(0.0f, 1.0f, 0.0f)) * glm::scale(glm::vec3(scale_));
glm::mat4 model_matrix = glm::rotate(angle_, glm::vec3(1.0f, 0.0f, 0.0f)) * glm::scale(glm::vec3(scale_));
glUniformMatrix4fv(Uniforms::UniformLocs::M, 1, false, glm::value_ptr(model_matrix));
glBindVertexArray(vao_);
glPatchParameteri(GL_PATCH_VERTICES, 4);
glDrawArrays(GL_PATCHES, 0, 4);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
fbo_.Unbind();