diff --git a/libhart/scene/mesh.hpp b/libhart/scene/mesh.hpp index ca7065b..6b4b85a 100644 --- a/libhart/scene/mesh.hpp +++ b/libhart/scene/mesh.hpp @@ -14,7 +14,7 @@ struct Vert { glm::vec3 Position; glm::vec3 Normal; - // glm::vec2 UV; + glm::vec2 UV; }; class Mesh diff --git a/res/shaders/basic.glsl b/res/shaders/basic.glsl index 9fd522c..93676f6 100644 --- a/res/shaders/basic.glsl +++ b/res/shaders/basic.glsl @@ -3,6 +3,7 @@ layout (location = 0) in vec3 position; layout (location = 1) in vec3 normal; +layout (location = 2) in vec2 uv; uniform mat4 model; uniform mat4 view; @@ -42,5 +43,5 @@ void main() { vec3 result = (ambient + diffuse) * objectColour; - outColour = vec4(result, 1.0); + outColour = vec4((vNormal + 1.0) /2.0, 1.0); } diff --git a/src/inferno.cpp b/src/inferno.cpp index d954d4a..7c19d05 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -132,6 +132,7 @@ int Inferno::run() ImGui::Image((ImTextureID)mRasterRenderer->getRenderedTexture(), { mRasterRenderer->getTargetSize().x, mRasterRenderer->getTargetSize().y }, ImVec2(0,1), ImVec2(1,0)); + glBindFramebuffer(GL_FRAMEBUFFER, 0); ImGui::End(); diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index 7c0f0d9..ead1be2 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -16,17 +16,26 @@ RasterizeRenderer::RasterizeRenderer() glGenFramebuffers(1, &mRenderTarget); glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget); + glGenTextures(1, &mRenderTargetTexture); glBindTexture(GL_TEXTURE_2D, mRenderTargetTexture); - - glEnable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + glGenTextures(1, &mRenderTargetDepthTexture ); + glBindTexture(GL_TEXTURE_2D, mRenderTargetDepthTexture ); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); + + 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_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // Attach the texture to the framebuffer. + glFramebufferTexture2D( GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, mRenderTargetDepthTexture, 0 ); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mRenderTargetTexture, 0); assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); @@ -46,15 +55,21 @@ void RasterizeRenderer::setScene(Scene* scene) void RasterizeRenderer::setTargetSize(glm::vec2 size) { glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget); + glBindTexture(GL_TEXTURE_2D, mRenderTargetTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + + glBindTexture(GL_TEXTURE_2D, mRenderTargetDepthTexture); + glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL ); + glBindFramebuffer(GL_FRAMEBUFFER, 0); mRenderTargetSize = size; } GLuint RasterizeRenderer::getRenderedTexture() { - return mRenderTarget; + glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget); + return mRenderTargetTexture; } glm::vec2 RasterizeRenderer::getTargetSize() @@ -75,6 +90,11 @@ void RasterizeRenderer::draw() glBindFramebuffer(GL_FRAMEBUFFER, mRenderTarget); glViewport(0, 0, mRenderTargetSize.x, mRenderTargetSize.y); + glEnable(GL_DEPTH_TEST); + // glDepthFunc(GL_GREATER); + + // glDisable(GL_CULL_FACE); + for (Mesh* m : mCurrentScene->getRenderables()) { m->getMaterial()->getGlShader()->use(); diff --git a/src/preview_renderer/renderer.hpp b/src/preview_renderer/renderer.hpp index c5c71a2..8e7126c 100644 --- a/src/preview_renderer/renderer.hpp +++ b/src/preview_renderer/renderer.hpp @@ -24,6 +24,7 @@ public: private: GLuint mRenderTarget = 0; GLuint mRenderTargetTexture = 0; + GLuint mRenderTargetDepthTexture = 0; glm::vec2 mRenderTargetSize = {1920, 1080}; Scene* mCurrentScene; diff --git a/src/scene/mesh.cpp b/src/scene/mesh.cpp index 79076b9..8792c91 100644 --- a/src/scene/mesh.cpp +++ b/src/scene/mesh.cpp @@ -37,6 +37,7 @@ void Mesh::loadOBJ(std::filesystem::path file) mObjLoader->getNormals()[i+1], mObjLoader->getNormals()[i+2], }; + mVerticies.push_back(vert); } } @@ -64,6 +65,9 @@ void Mesh::ready() // vertex normals glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*)offsetof(Vert, Normal)); + // vertex UV + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vert), (void*)offsetof(Vert, UV)); glBindVertexArray(0); diff --git a/src/window.cpp b/src/window.cpp index b54823a..1fae940 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -140,9 +140,6 @@ void Window::setupGLFW(std::string title) glfwMakeContextCurrent(window); gladLoadGLLoader((GLADloadproc)glfwGetProcAddress); glfwSwapInterval(1); // Enable vsync - - glEnable(GL_DEPTH_TEST); - glDisable(GL_CULL_FACE); } void Window::setupImGui()