Refactor, setup FBO, and render into ImGui window
This commit is contained in:
parent
0e348944b1
commit
7060c08217
18
imgui.ini
18
imgui.ini
|
@ -5,7 +5,7 @@ Collapsed=0
|
||||||
|
|
||||||
[Window][Terrain Controls]
|
[Window][Terrain Controls]
|
||||||
Pos=0,19
|
Pos=0,19
|
||||||
Size=1280,86
|
Size=1498,94
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000001,0
|
DockId=0x00000001,0
|
||||||
|
|
||||||
|
@ -19,11 +19,17 @@ Collapsed=0
|
||||||
|
|
||||||
[Window][TerraVisor]
|
[Window][TerraVisor]
|
||||||
Pos=0,0
|
Pos=0,0
|
||||||
Size=1280,720
|
Size=1498,720
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Docking][Data]
|
[Window][Scene Window]
|
||||||
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1280,701 Split=Y
|
Pos=0,115
|
||||||
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=1280,86 Selected=0xF69494A7
|
Size=1498,605
|
||||||
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=1280,613 CentralNode=1
|
Collapsed=0
|
||||||
|
DockId=0x00000002,0
|
||||||
|
|
||||||
|
[Docking][Data]
|
||||||
|
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,19 Size=1498,701 Split=Y Selected=0x9F2D9299
|
||||||
|
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=1280,94 Selected=0xF69494A7
|
||||||
|
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=1280,605 CentralNode=1 Selected=0x9F2D9299
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,15 @@ class Scene {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitBuffers();
|
void InitBuffers();
|
||||||
|
void InitQuadBuffers();
|
||||||
void InitShaders();
|
void InitShaders();
|
||||||
|
|
||||||
FBO fbo_;
|
FBO fbo_;
|
||||||
|
FBO post_fbo_;
|
||||||
GLuint shader_program_;
|
GLuint shader_program_;
|
||||||
|
GLuint quad_shader_program_;
|
||||||
GLuint vao_;
|
GLuint vao_;
|
||||||
|
GLuint quad_vao_;
|
||||||
float angle_;
|
float angle_;
|
||||||
float scale_;
|
float scale_;
|
||||||
float aspect_;
|
float aspect_;
|
||||||
|
|
|
@ -54,6 +54,6 @@ void main(void)
|
||||||
// vec4 specular_term = atten*ks*Ls*pow(max(0.0, dot(rw, vw)), shininess);
|
// vec4 specular_term = atten*ks*Ls*pow(max(0.0, dot(rw, vw)), shininess);
|
||||||
|
|
||||||
// fragcolor = ambient_term + diffuse_term + specular_term;
|
// fragcolor = ambient_term + diffuse_term + specular_term;
|
||||||
fragcolor = vec4(1.0, 0.0, 0.0, 1.0);
|
fragcolor = vec4(0.0, 0.0, 1.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#version 330 core
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
in vec2 TexCoord;
|
||||||
|
|
||||||
|
uniform sampler2D screenTexture;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = texture(screenTexture, TexCoord);
|
||||||
|
//FragColor = vec4(vec3(1.0 - texture(screenTexture, TexCoord)), 1.0);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#version 330 core
|
||||||
|
layout(location = 0) in vec3 pos_attrib; //this variable holds the position of mesh vertices
|
||||||
|
layout(location = 1) in vec2 tex_coord_attrib;
|
||||||
|
layout(location = 2) in vec3 normal_attrib;
|
||||||
|
|
||||||
|
out vec2 TexCoord;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = vec4(pos_attrib.xy, 0.0, 1.0);
|
||||||
|
TexCoord = tex_coord_attrib;
|
||||||
|
}
|
|
@ -19,6 +19,8 @@ void FBO::Init(int width, int height) {
|
||||||
glGenTextures(1, &color_texture_id_);
|
glGenTextures(1, &color_texture_id_);
|
||||||
glBindTexture(GL_TEXTURE_2D, color_texture_id_);
|
glBindTexture(GL_TEXTURE_2D, color_texture_id_);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture_id_, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color_texture_id_, 0);
|
||||||
|
|
|
@ -27,16 +27,21 @@ namespace {
|
||||||
const std::string kVertexShaderPath = "shaders/vertex.glsl";
|
const std::string kVertexShaderPath = "shaders/vertex.glsl";
|
||||||
const std::string kFragmentShaderPath = "shaders/fragment.glsl";
|
const std::string kFragmentShaderPath = "shaders/fragment.glsl";
|
||||||
|
|
||||||
|
const std::string kQuadVertexPath = "shaders/quad_vertex.glsl";
|
||||||
|
const std::string kQuadFragmentPath = "shaders/quad_fragment.glsl";
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
Scene::Scene(int width, int height)
|
Scene::Scene(int width, int height)
|
||||||
: window_width(width),
|
: window_width(width),
|
||||||
window_height(height),
|
window_height(height),
|
||||||
shader_program_(-1),
|
shader_program_(-1),
|
||||||
|
quad_shader_program_(-1),
|
||||||
vao_(-1),
|
vao_(-1),
|
||||||
|
quad_vao_(-1),
|
||||||
angle_(0.0f),
|
angle_(0.0f),
|
||||||
scale_(1.0f),
|
scale_(1.0f),
|
||||||
aspect_(1280.0f / 720.0f),
|
aspect_(static_cast<float>(width) / static_cast<float>(height)),
|
||||||
near_z_(0.1f), far_z_(100.0f),
|
near_z_(0.1f), far_z_(100.0f),
|
||||||
fov_(glm::pi<float>() / 4.0f)
|
fov_(glm::pi<float>() / 4.0f)
|
||||||
{}
|
{}
|
||||||
|
@ -46,6 +51,7 @@ Scene::~Scene() {
|
||||||
glDeleteVertexArrays(1, &vao_);
|
glDeleteVertexArrays(1, &vao_);
|
||||||
|
|
||||||
fbo_.~FBO();
|
fbo_.~FBO();
|
||||||
|
post_fbo_.~FBO();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::Init() {
|
void Scene::Init() {
|
||||||
|
@ -55,9 +61,12 @@ void Scene::Init() {
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
|
||||||
fbo_.Init(window_width, window_height);
|
fbo_.Init(window_width, window_height);
|
||||||
|
post_fbo_.Init(window_width, window_height);
|
||||||
|
|
||||||
InitBuffers();
|
InitBuffers();
|
||||||
ReloadShader();
|
ReloadShader();
|
||||||
|
InitQuadBuffers();
|
||||||
|
quad_shader_program_ = InitShader(kQuadVertexPath.c_str(), kQuadFragmentPath.c_str());
|
||||||
|
|
||||||
UpdateCamera();
|
UpdateCamera();
|
||||||
Uniforms::Init();
|
Uniforms::Init();
|
||||||
|
@ -82,6 +91,34 @@ void Scene::InitBuffers() {
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Scene::InitQuadBuffers() {
|
||||||
|
GLuint quad_vbo;
|
||||||
|
// Full-screen quad vertices (position and texture coordinates)
|
||||||
|
float quadVertices[] = {
|
||||||
|
// positions // texCoords
|
||||||
|
-1.0f, 1.0f, 0.0f, 1.0f, // Top-left
|
||||||
|
-1.0f, -1.0f, 0.0f, 0.0f, // Bottom-left
|
||||||
|
1.0f, 1.0f, 1.0f, 1.0f, // Top-right
|
||||||
|
1.0f, -1.0f, 1.0f, 0.0f // Bottom-right
|
||||||
|
};
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &quad_vao_);
|
||||||
|
glGenBuffers(1, &quad_vbo);
|
||||||
|
glBindVertexArray(quad_vao_);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, quad_vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
|
||||||
|
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Allows for runtime shader updates
|
// Allows for runtime shader updates
|
||||||
void Scene::ReloadShader() {
|
void Scene::ReloadShader() {
|
||||||
GLuint new_shader = InitShader(kVertexShaderPath.c_str(), kFragmentShaderPath.c_str());
|
GLuint new_shader = InitShader(kVertexShaderPath.c_str(), kFragmentShaderPath.c_str());
|
||||||
|
@ -102,6 +139,8 @@ void Scene::Display(GLFWwindow* window) {
|
||||||
|
|
||||||
fbo_.Bind();
|
fbo_.Bind();
|
||||||
|
|
||||||
|
glUseProgram(shader_program_);
|
||||||
|
|
||||||
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(Uniforms::SceneData.eye_w), 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::SceneData.PV = projection_matrix_ * view_matrix_; // Projection-View matrix
|
||||||
Uniforms::BufferSceneData();
|
Uniforms::BufferSceneData();
|
||||||
|
@ -109,12 +148,30 @@ void Scene::Display(GLFWwindow* window) {
|
||||||
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(0.0f, 1.0f, 0.0f)) * glm::scale(glm::vec3(scale_));
|
||||||
glUniformMatrix4fv(Uniforms::UniformLocs::M, 1, false, glm::value_ptr(model_matrix));
|
glUniformMatrix4fv(Uniforms::UniformLocs::M, 1, false, glm::value_ptr(model_matrix));
|
||||||
|
|
||||||
glUseProgram(shader_program_);
|
|
||||||
glBindVertexArray(vao_);
|
glBindVertexArray(vao_);
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
fbo_.Unbind();
|
fbo_.Unbind();
|
||||||
|
|
||||||
|
// post_fbo_ currently renders with a nasty artifact. Need to fix
|
||||||
|
post_fbo_.Bind();
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
glUseProgram(quad_shader_program_);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, fbo_.GetColorTexture());
|
||||||
|
|
||||||
|
GLint screenTextureLoc = glGetUniformLocation(quad_shader_program_, "screenTexture");
|
||||||
|
glUniform1i(screenTextureLoc, 0); // Texture unit 0
|
||||||
|
|
||||||
|
// Render the full-screen quad
|
||||||
|
glBindVertexArray(quad_vao_);
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
|
||||||
|
post_fbo_.Unbind();
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
DrawGui(window);
|
DrawGui(window);
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
}
|
}
|
||||||
|
@ -177,6 +234,12 @@ void Scene::DrawGui(GLFWwindow* window) {
|
||||||
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
||||||
|
// Draw FBO to ImGui window
|
||||||
|
ImGui::Begin("Scene Window");
|
||||||
|
ImVec2 windowSize = ImGui::GetContentRegionAvail();
|
||||||
|
ImGui::Image((void*)(intptr_t)post_fbo_.GetColorTexture(), windowSize, ImVec2(0, 1), ImVec2(1, 0));
|
||||||
|
ImGui::End();
|
||||||
|
|
||||||
ImGui::Render();
|
ImGui::Render();
|
||||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue