From 91edab34bc9156fe26800d5b47de606db8fd2ba5 Mon Sep 17 00:00:00 2001 From: Tleety Date: Fri, 11 Dec 2015 11:18:30 +0100 Subject: [PATCH] PickingPass now sets state and clear it when done. PickingState now it's own class so renderer is a bit cleaner. --- include/Engine/Rendering/PickingPass.h | 45 ++++++ include/Engine/Rendering/Renderer.h | 13 +- include/Engine/Rendering/ShaderProgram.h | 4 + include/Engine/Rendering/Util/GLError.h | 2 +- src/Engine/Rendering/FrameBuffer.cpp | 10 +- src/Engine/Rendering/PickingPass.cpp | 105 +++++++++++++ src/Engine/Rendering/PickingPassState.cpp | 5 + src/Engine/Rendering/RenderState.cpp | 2 +- src/Engine/Rendering/Renderer.cpp | 182 +++++++++++----------- 9 files changed, 264 insertions(+), 104 deletions(-) create mode 100644 include/Engine/Rendering/PickingPass.h create mode 100644 src/Engine/Rendering/PickingPass.cpp diff --git a/include/Engine/Rendering/PickingPass.h b/include/Engine/Rendering/PickingPass.h new file mode 100644 index 00000000..313751d5 --- /dev/null +++ b/include/Engine/Rendering/PickingPass.h @@ -0,0 +1,45 @@ +#ifndef PickingPass_h__ +#define PickingPass_h__ + +#include "IRenderer.h" +#include "PickingPassState.h" +#include "FrameBuffer.h" +#include "ShaderProgram.h" +#include "Util/UnorderedMapVec2.h" + +class PickingPass +{ +public: + PickingPass(IRenderer* renderer); + ~PickingPass(); + void InitializeTextures(); + void InitializeFrameBuffers(); + void InitializeShaderPrograms(); + + void Draw(RenderQueueCollection& rq); + + + //Getters + const ShaderProgram& PickingProgram() const { return m_PickingProgram; } + const std::unordered_map& PickingColorsToEntity() const { return m_PickingColorsToEntity; } + GLuint PickingTexture() const { return m_PickingTexture; } + GLuint DepthBuffer() const { return m_DepthBuffer; } + const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } + + +private: + void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const; + + const IRenderer* m_Renderer; + + ShaderProgram m_PickingProgram; + + std::unordered_map m_PickingColorsToEntity; + + GLuint m_PickingTexture; + GLuint m_DepthBuffer; + + FrameBuffer m_PickingBuffer; +}; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index b0ddf870..18f32a17 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -10,6 +10,8 @@ #include "Util/UnorderedMapVec2.h" #include "FrameBuffer.h" #include "../Core/World.h" +#include "PickingPass.h" + #define TILE_SIZE 16 #define NUM_LIGHTS 3 @@ -35,17 +37,12 @@ private: Texture* m_ErrorTexture; Texture* m_WhiteTexture; float m_CameraMoveSpeed; - FrameBuffer m_PickingBuffer; - GLuint m_PickingTexture; - GLuint m_DepthBuffer; Model* m_ScreenQuad; Model* m_UnitQuad; Model* m_UnitSphere; - - - std::unordered_map m_PickingColorsToEntity; + PickingPass* m_PickingPass; //----------------------Functions----------------------// void InitializeWindow(); @@ -53,9 +50,10 @@ private: void InitializeTextures(); void InitializeFrameBuffers(); void InitializeSSBOs(); + void InitializeRenderPasses(); //TODO: Renderer: Get InputUpdate out of renderer void InputUpdate(double dt); - void PickingPass(RenderQueueCollection& rq); + //void PickingPass(RenderQueueCollection& rq); void DrawScreenQuad(GLuint textureToDraw); void DrawScene(RenderQueueCollection& rq); @@ -106,7 +104,6 @@ private: void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); //--------------------ShaderPrograms-------------------// ShaderProgram m_BasicForwardProgram; - ShaderProgram m_PickingProgram; ShaderProgram m_DrawScreenQuadProgram; ShaderProgram m_CalculateFrustumProgram; ShaderProgram m_LightCullProgram; diff --git a/include/Engine/Rendering/ShaderProgram.h b/include/Engine/Rendering/ShaderProgram.h index 1b87650e..097e09c3 100644 --- a/include/Engine/Rendering/ShaderProgram.h +++ b/include/Engine/Rendering/ShaderProgram.h @@ -1,3 +1,5 @@ +#ifndef ShaderProgram_h__ +#define ShaderProgram_h__ #include "../Common.h" #include "../OpenGL.h" @@ -79,3 +81,5 @@ private: GLuint m_ShaderProgramHandle; std::vector> m_Shaders; }; + +#endif \ No newline at end of file diff --git a/include/Engine/Rendering/Util/GLError.h b/include/Engine/Rendering/Util/GLError.h index 8202f433..754623d1 100644 --- a/include/Engine/Rendering/Util/GLError.h +++ b/include/Engine/Rendering/Util/GLError.h @@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig GLenum error = glGetError(); if (error != GL_NO_ERROR) { - _LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s %i %s", info, error, gluErrorString(error)); + _LOG(LOG_LEVEL_ERROR, file, func, line, "GL Error: %s, %i, %s", info, error, gluErrorString(error)); return true; } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index 1b53d868..b2b29626 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -48,13 +48,21 @@ void FrameBuffer::Generate() switch ((*it)->m_ResourceType) { case GL_TEXTURE_2D: glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0); + GLERROR("FrameBuffer generate: glFramebufferTexture2D"); + break; case GL_RENDERBUFFER: glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle); + GLERROR("FrameBuffer generate: glFramebufferRenderbuffer"); + if ( (*it)->m_Attachment != GL_COLOR_ATTACHMENT0 || + (*it)->m_Attachment != GL_DEPTH_ATTACHMENT || + (*it)->m_Attachment != GL_STENCIL_ATTACHMENT) + { + LOG_ERROR("RenderBuffer Attachment not valid."); + } break; } - GLERROR("FrameBuffer generate"); if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) { attachments.push_back((*it)->m_Attachment); diff --git a/src/Engine/Rendering/PickingPass.cpp b/src/Engine/Rendering/PickingPass.cpp new file mode 100644 index 00000000..5b44cbf4 --- /dev/null +++ b/src/Engine/Rendering/PickingPass.cpp @@ -0,0 +1,105 @@ +#include "Rendering/PickingPass.h" + +PickingPass::PickingPass(IRenderer* renderer) +{ + m_Renderer = renderer; + InitializeTextures(); + InitializeFrameBuffers(); + InitializeShaderPrograms(); +} + +PickingPass::~PickingPass() +{ + +} + +void PickingPass::InitializeTextures() +{ + GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, + glm::vec2(m_Renderer->Resolution().Width, m_Renderer->Resolution().Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); +} + +void PickingPass::InitializeFrameBuffers() +{ + glGenRenderbuffers(1, &m_DepthBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Renderer->Resolution().Width, m_Renderer->Resolution().Height); + + m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); + m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); + m_PickingBuffer.Generate(); +} + +void PickingPass::InitializeShaderPrograms() +{ + m_PickingProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); + m_PickingProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); + m_PickingProgram.Compile(); + m_PickingProgram.BindFragDataLocation(0, "TextureFragment"); + m_PickingProgram.Link(); +} + +void PickingPass::Draw(RenderQueueCollection& rq) +{ + m_PickingColorsToEntity.clear(); + m_PickingBuffer.Bind(); + PickingPassState state; + + int r = 1; + int g = 0; + //TODO: Render: Add code for more jobs than modeljobs. + + + GLuint ShaderHandle = m_PickingProgram.GetHandle(); + m_PickingProgram.Bind(); + + for (auto &job : rq.Forward) { + auto modelJob = std::dynamic_pointer_cast(job); + + if (modelJob) { + //--------------- + //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. + //--------------- + int pickColor[2] = { r, g }; + for (auto i : m_PickingColorsToEntity) { + if (modelJob->Entity == i.second) { + pickColor[0] = i.first.x; + pickColor[1] = i.first.y; + r -= 1; + } + } + m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + + //Render picking stuff + //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ViewMatrix())); + glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Renderer->Camera()->ProjectionMatrix())); + glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); + + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, nullptr, modelJob->StartIndex); + r += 1; + if (r > 255) { + r = 0; + g += 1; + } + } + } + m_PickingBuffer.Unbind(); + GLERROR("PickingPass Error"); +} + +void PickingPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const +{ + //TODO: Renderer: Make this in a sparate class + glGenTextures(1, texture); + glBindTexture(GL_TEXTURE_2D, *texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, dimensions.x, dimensions.y, 0, format, type, nullptr);//TODO: Renderer: Fix the precision and Resolution + GLERROR("Texture initialization failed"); +} diff --git a/src/Engine/Rendering/PickingPassState.cpp b/src/Engine/Rendering/PickingPassState.cpp index 9822c47e..18f702ee 100644 --- a/src/Engine/Rendering/PickingPassState.cpp +++ b/src/Engine/Rendering/PickingPassState.cpp @@ -3,6 +3,7 @@ PickingPassState::PickingPassState() { + Enable(GL_DEPTH_TEST); Enable(GL_CULL_FACE); CullFace(GL_BACK); @@ -12,3 +13,7 @@ PickingPassState::PickingPassState() Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } +PickingPassState::~PickingPassState() +{ + +} diff --git a/src/Engine/Rendering/RenderState.cpp b/src/Engine/Rendering/RenderState.cpp index 6844dbfd..3db428e4 100644 --- a/src/Engine/Rendering/RenderState.cpp +++ b/src/Engine/Rendering/RenderState.cpp @@ -32,7 +32,7 @@ bool RenderState::CullFace(GLenum GLCullFace) glGetIntegerv(GL_CULL_FACE_MODE, &a); if(a == GL_BACK) { - LOG_INFO("Setting Cullface to back, unessesary since this is already default."); + //LOG_INFO("Setting Cullface to back, unessesary since this is already default."); } m_preCullFace = a; glCullFace(GLCullFace); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index c483cdc6..8316cfa7 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -11,6 +11,7 @@ void Renderer::Initialize() m_Camera = m_DefaultCamera; } TEMPCreateLights(); + InitializeRenderPasses(); glfwSwapInterval(m_VSYNC); InitializeShaders(); @@ -71,24 +72,18 @@ void Renderer::InitializeShaders() m_BasicForwardProgram.Compile(); m_BasicForwardProgram.Link(); - m_PickingProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/Picking.vert.glsl"))); - m_PickingProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/Picking.frag.glsl"))); - m_PickingProgram.Compile(); - m_PickingProgram.BindFragDataLocation(0, "TextureFragment"); - m_PickingProgram.Link(); - m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); m_DrawScreenQuadProgram.AddShader(std::shared_ptr(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram.Compile(); m_DrawScreenQuadProgram.Link(); - m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); - m_CalculateFrustumProgram.Compile(); - m_CalculateFrustumProgram.Link(); + //m_CalculateFrustumProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); + //m_CalculateFrustumProgram.Compile(); + //m_CalculateFrustumProgram.Link(); - m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); - m_LightCullProgram.Compile(); - m_LightCullProgram.Link(); + //m_LightCullProgram.AddShader(std::shared_ptr(new ComputeShader("Shaders/cullLights.comp.glsl"))); + //m_LightCullProgram.Compile(); + //m_LightCullProgram.Link(); } void Renderer::InputUpdate(double dt) @@ -125,26 +120,26 @@ void Renderer::InputUpdate(double dt) static double mousePosX, mousePosY; glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); - if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { - ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); - - glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); - // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); + //if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { + // ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); + // + // glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); + // // glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); - //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); - //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); - //printf("\n\n---------------------------\n"); - auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); - if (got == m_PickingColorsToEntity.end()) - printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); - else - printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); - //printf("----\n"); - //for (auto i : m_PickingColorsToEntity) { - // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); - //} - //printf("---------------------------\n\n"); - } + // //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); + // //printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); + // //printf("\n\n---------------------------\n"); + // //auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); + // //if (got == m_PickingColorsToEntity.end()) + // // printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); + // //else + // // printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); + // //printf("----\n"); + // //for (auto i : m_PickingColorsToEntity) { + // // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g); + // //} + // //printf("---------------------------\n\n"); + //} if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) { @@ -177,8 +172,8 @@ void Renderer::Update(double dt) void Renderer::Draw(RenderQueueCollection& rq) { //TODO: Renderer: Kanske borde vara längst upp i update. - PickingPass(rq); - //DrawScreenQuad(m_PickingTexture); + m_PickingPass->Draw(rq); + //DrawScreenQuad(m_PickingPass->PickingTexture()); //CullLights(); DrawScene(rq); @@ -229,64 +224,63 @@ void Renderer::DrawScene(RenderQueueCollection& rq) GLERROR("DrawScene Error"); } -void Renderer::PickingPass(RenderQueueCollection& rq) -{ - m_PickingColorsToEntity.clear(); - m_PickingBuffer.Bind(); +//void Renderer::PickingPass(RenderQueueCollection& rq) +//{ + //m_PickingColorsToEntity.clear(); + //m_PickingBuffer.Bind(); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); + //glEnable(GL_DEPTH_TEST); + //glEnable(GL_CULL_FACE); + //glCullFace(GL_BACK); - glClearColor(0.f, 0.f, 0.f, 1.f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - int r = 1; - int g = 0; - //TODO: Render: Add code for more jobs than modeljobs. + //glClearColor(0.f, 0.f, 0.f, 1.f); + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //int r = 1; + //int g = 0; + ////TODO: Render: Add code for more jobs than modeljobs. - GLuint ShaderHandle = m_PickingProgram.GetHandle(); - m_PickingProgram.Bind(); + //GLuint ShaderHandle = m_PickingProgram.GetHandle(); + //m_PickingProgram.Bind(); - for (auto &job : rq.Forward) { - auto modelJob = std::dynamic_pointer_cast(job); + //for (auto &job : rq.Forward) { + // auto modelJob = std::dynamic_pointer_cast(job); - if (modelJob) { - //--------------- - //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. - //--------------- - int pickColor[2] = { r, g }; - for (auto i : m_PickingColorsToEntity) { - if(modelJob->Entity == i.second) { - pickColor[0] = i.first.x; - pickColor[1] = i.first.y; - r -= 1; - } - } - m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; - + // if (modelJob) { + // //--------------- + // //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. + // //--------------- + // int pickColor[2] = { r, g }; + // for (auto i : m_PickingColorsToEntity) { + // if(modelJob->Entity == i.second) { + // pickColor[0] = i.first.x; + // pickColor[1] = i.first.y; + // r -= 1; + // } + // } + // m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; + // - //Render picking stuff - //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); - glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); + // //Render picking stuff + // //TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms + // glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); + // glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); + // glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); + // glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); - glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); - r += 1; - if(r > 255) { - r = 0; - g += 1; - } - } - } - m_PickingBuffer.Unbind(); - GLERROR("PickingPass Error"); - -} + // glBindVertexArray(modelJob->Model->VAO); + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + // glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); + // r += 1; + // if(r > 255) { + // r = 0; + // g += 1; + // } + // } + //} + //m_PickingBuffer.Unbind(); + //GLERROR("PickingPass Error"); +//} void Renderer::DrawScreenQuad(GLuint textureToDraw) { @@ -323,9 +317,6 @@ void Renderer::InitializeTextures() glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, m_Resolution.Width, m_Resolution.Height, 0, GL_RG, GL_FLOAT, NULL);//TODO: Renderer: Fix the precision and Resolution GLERROR("m_PickingTexture initialization failed"); */ - - GenerateTexture(&m_PickingTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, - glm::vec2(m_Resolution.Width, m_Resolution.Height), GL_RG8, GL_RG, GL_UNSIGNED_BYTE); } void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) @@ -342,13 +333,13 @@ void Renderer::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filterin void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big { - glGenRenderbuffers(1, &m_DepthBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); - - m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); - m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); - m_PickingBuffer.Generate(); + //glGenRenderbuffers(1, &m_DepthBuffer); + //glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); + // + //m_PickingBuffer.AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); + //m_PickingBuffer.AddResource(std::shared_ptr(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); + //m_PickingBuffer.Generate(); } void Renderer::InitializeSSBOs() @@ -399,6 +390,11 @@ void Renderer::InitializeSSBOs() } +void Renderer::InitializeRenderPasses() +{ + m_PickingPass = new PickingPass(this); +} + void Renderer::CalculateFrustum() { GLERROR("CalculateFrustum Error-1");