PickingPass now sets state and clear it when done.

PickingState now it's own class so renderer is a bit cleaner.
This commit is contained in:
Tleety
2015-12-11 11:18:30 +01:00
parent cefc4e5257
commit 91edab34bc
9 changed files with 264 additions and 104 deletions
+45
View File
@@ -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<glm::vec2, EntityID>& 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<glm::vec2, EntityID> m_PickingColorsToEntity;
GLuint m_PickingTexture;
GLuint m_DepthBuffer;
FrameBuffer m_PickingBuffer;
};
#endif
+5 -8
View File
@@ -10,6 +10,8 @@
#include "Util/UnorderedMapVec2.h" #include "Util/UnorderedMapVec2.h"
#include "FrameBuffer.h" #include "FrameBuffer.h"
#include "../Core/World.h" #include "../Core/World.h"
#include "PickingPass.h"
#define TILE_SIZE 16 #define TILE_SIZE 16
#define NUM_LIGHTS 3 #define NUM_LIGHTS 3
@@ -35,17 +37,12 @@ private:
Texture* m_ErrorTexture; Texture* m_ErrorTexture;
Texture* m_WhiteTexture; Texture* m_WhiteTexture;
float m_CameraMoveSpeed; float m_CameraMoveSpeed;
FrameBuffer m_PickingBuffer;
GLuint m_PickingTexture;
GLuint m_DepthBuffer;
Model* m_ScreenQuad; Model* m_ScreenQuad;
Model* m_UnitQuad; Model* m_UnitQuad;
Model* m_UnitSphere; Model* m_UnitSphere;
PickingPass* m_PickingPass;
std::unordered_map<glm::vec2, EntityID> m_PickingColorsToEntity;
//----------------------Functions----------------------// //----------------------Functions----------------------//
void InitializeWindow(); void InitializeWindow();
@@ -53,9 +50,10 @@ private:
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeSSBOs(); void InitializeSSBOs();
void InitializeRenderPasses();
//TODO: Renderer: Get InputUpdate out of renderer //TODO: Renderer: Get InputUpdate out of renderer
void InputUpdate(double dt); void InputUpdate(double dt);
void PickingPass(RenderQueueCollection& rq); //void PickingPass(RenderQueueCollection& rq);
void DrawScreenQuad(GLuint textureToDraw); void DrawScreenQuad(GLuint textureToDraw);
void DrawScene(RenderQueueCollection& rq); 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); void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
//--------------------ShaderPrograms-------------------// //--------------------ShaderPrograms-------------------//
ShaderProgram m_BasicForwardProgram; ShaderProgram m_BasicForwardProgram;
ShaderProgram m_PickingProgram;
ShaderProgram m_DrawScreenQuadProgram; ShaderProgram m_DrawScreenQuadProgram;
ShaderProgram m_CalculateFrustumProgram; ShaderProgram m_CalculateFrustumProgram;
ShaderProgram m_LightCullProgram; ShaderProgram m_LightCullProgram;
+4
View File
@@ -1,3 +1,5 @@
#ifndef ShaderProgram_h__
#define ShaderProgram_h__
#include "../Common.h" #include "../Common.h"
#include "../OpenGL.h" #include "../OpenGL.h"
@@ -79,3 +81,5 @@ private:
GLuint m_ShaderProgramHandle; GLuint m_ShaderProgramHandle;
std::vector<std::shared_ptr<Shader>> m_Shaders; std::vector<std::shared_ptr<Shader>> m_Shaders;
}; };
#endif
+1 -1
View File
@@ -9,7 +9,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig
GLenum error = glGetError(); GLenum error = glGetError();
if (error != GL_NO_ERROR) 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; return true;
} }
+9 -1
View File
@@ -48,13 +48,21 @@ void FrameBuffer::Generate()
switch ((*it)->m_ResourceType) { switch ((*it)->m_ResourceType) {
case GL_TEXTURE_2D: case GL_TEXTURE_2D:
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
break; break;
case GL_RENDERBUFFER: case GL_RENDERBUFFER:
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle); 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; break;
} }
GLERROR("FrameBuffer generate");
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) { if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT) {
attachments.push_back((*it)->m_Attachment); attachments.push_back((*it)->m_Attachment);
+105
View File
@@ -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<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
m_PickingBuffer.Generate();
}
void PickingPass::InitializeShaderPrograms()
{
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Picking.vert.glsl")));
m_PickingProgram.AddShader(std::shared_ptr<Shader>(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<ModelJob>(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");
}
@@ -3,6 +3,7 @@
PickingPassState::PickingPassState() PickingPassState::PickingPassState()
{ {
Enable(GL_DEPTH_TEST); Enable(GL_DEPTH_TEST);
Enable(GL_CULL_FACE); Enable(GL_CULL_FACE);
CullFace(GL_BACK); CullFace(GL_BACK);
@@ -12,3 +13,7 @@ PickingPassState::PickingPassState()
Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
} }
PickingPassState::~PickingPassState()
{
}
+1 -1
View File
@@ -32,7 +32,7 @@ bool RenderState::CullFace(GLenum GLCullFace)
glGetIntegerv(GL_CULL_FACE_MODE, &a); glGetIntegerv(GL_CULL_FACE_MODE, &a);
if(a == GL_BACK) 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; m_preCullFace = a;
glCullFace(GLCullFace); glCullFace(GLCullFace);
+89 -93
View File
@@ -11,6 +11,7 @@ void Renderer::Initialize()
m_Camera = m_DefaultCamera; m_Camera = m_DefaultCamera;
} }
TEMPCreateLights(); TEMPCreateLights();
InitializeRenderPasses();
glfwSwapInterval(m_VSYNC); glfwSwapInterval(m_VSYNC);
InitializeShaders(); InitializeShaders();
@@ -71,24 +72,18 @@ void Renderer::InitializeShaders()
m_BasicForwardProgram.Compile(); m_BasicForwardProgram.Compile();
m_BasicForwardProgram.Link(); m_BasicForwardProgram.Link();
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/Picking.vert.glsl")));
m_PickingProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Picking.frag.glsl")));
m_PickingProgram.Compile();
m_PickingProgram.BindFragDataLocation(0, "TextureFragment");
m_PickingProgram.Link();
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/DrawScreenQuad.vert.glsl"))); m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/DrawScreenQuad.vert.glsl")));
m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl"))); m_DrawScreenQuadProgram.AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/DrawScreenQuad.frag.glsl")));
m_DrawScreenQuadProgram.Compile(); m_DrawScreenQuadProgram.Compile();
m_DrawScreenQuadProgram.Link(); m_DrawScreenQuadProgram.Link();
m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/GridFrustum.comp.glsl"))); //m_CalculateFrustumProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/GridFrustum.comp.glsl")));
m_CalculateFrustumProgram.Compile(); //m_CalculateFrustumProgram.Compile();
m_CalculateFrustumProgram.Link(); //m_CalculateFrustumProgram.Link();
m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl"))); //m_LightCullProgram.AddShader(std::shared_ptr<Shader>(new ComputeShader("Shaders/cullLights.comp.glsl")));
m_LightCullProgram.Compile(); //m_LightCullProgram.Compile();
m_LightCullProgram.Link(); //m_LightCullProgram.Link();
} }
void Renderer::InputUpdate(double dt) void Renderer::InputUpdate(double dt)
@@ -125,26 +120,26 @@ void Renderer::InputUpdate(double dt)
static double mousePosX, mousePosY; static double mousePosX, mousePosY;
glfwGetCursorPos(m_Window, &mousePosX, &mousePosY); glfwGetCursorPos(m_Window, &mousePosX, &mousePosY);
if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) { //if (glfwGetMouseButton(m_Window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS) {
ScreenCoords::PixelData data = ScreenCoords::ToPixelData(mousePosX, m_Resolution.Height - mousePosY, &m_PickingBuffer, m_DepthBuffer); // 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));
glm::vec3 viewPos = ScreenCoords::ToWorldPos(mousePosX, m_Resolution.Height - mousePosY, data.Depth, m_Resolution, m_Camera->ProjectionMatrix(), m_Camera->ViewMatrix()); // //printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth);
// glm::vec3 worldPos = glm::vec3(glm::inverse(m_Camera->ViewMatrix()) * glm::vec4(viewPos, 1.f)); // //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");
//printf("R: %f, G: %f, Depth: %f\n", data.Color[0], data.Color[1], data.Depth); // //auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1]));
//printf("view: x: %f, y: %f z: %f, Length: %f\n\n", viewPos.x, viewPos.y, viewPos.z, glm::length(viewPos)); // //if (got == m_PickingColorsToEntity.end())
//printf("\n\n---------------------------\n"); // // printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]);
auto got = m_PickingColorsToEntity.find(glm::vec2(data.Color[0], data.Color[1])); // //else
if (got == m_PickingColorsToEntity.end()) // // printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second);
printf("Color (R:%f, G:%f) not found.\n", data.Color[0], data.Color[1]); // //printf("----\n");
else // //for (auto i : m_PickingColorsToEntity) {
printf("R:%f G:%f, EntityID: %i\n", got->first.r, got->first.g, got->second); // // printf("Entity: %i, Color: R: %f, G: %f\n", i.second, i.first.r, i.first.g);
//printf("----\n"); // //}
//for (auto i : m_PickingColorsToEntity) { // //printf("---------------------------\n\n");
// 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) { if (glfwGetKey(m_Window, GLFW_KEY_SPACE) == GLFW_PRESS) {
@@ -177,8 +172,8 @@ void Renderer::Update(double dt)
void Renderer::Draw(RenderQueueCollection& rq) void Renderer::Draw(RenderQueueCollection& rq)
{ {
//TODO: Renderer: Kanske borde vara längst upp i update. //TODO: Renderer: Kanske borde vara längst upp i update.
PickingPass(rq); m_PickingPass->Draw(rq);
//DrawScreenQuad(m_PickingTexture); //DrawScreenQuad(m_PickingPass->PickingTexture());
//CullLights(); //CullLights();
DrawScene(rq); DrawScene(rq);
@@ -229,64 +224,63 @@ void Renderer::DrawScene(RenderQueueCollection& rq)
GLERROR("DrawScene Error"); GLERROR("DrawScene Error");
} }
void Renderer::PickingPass(RenderQueueCollection& rq) //void Renderer::PickingPass(RenderQueueCollection& rq)
{ //{
m_PickingColorsToEntity.clear(); //m_PickingColorsToEntity.clear();
m_PickingBuffer.Bind(); //m_PickingBuffer.Bind();
glEnable(GL_DEPTH_TEST); //glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE); //glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); //glCullFace(GL_BACK);
glClearColor(0.f, 0.f, 0.f, 1.f); //glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
int r = 1; //int r = 1;
int g = 0; //int g = 0;
//TODO: Render: Add code for more jobs than modeljobs. ////TODO: Render: Add code for more jobs than modeljobs.
GLuint ShaderHandle = m_PickingProgram.GetHandle(); //GLuint ShaderHandle = m_PickingProgram.GetHandle();
m_PickingProgram.Bind(); //m_PickingProgram.Bind();
for (auto &job : rq.Forward) { //for (auto &job : rq.Forward) {
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job); // auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
if (modelJob) { // if (modelJob) {
//--------------- // //---------------
//TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame. // //TODO: Renderer: IMPORTANT: Fixa detta så det inte loopar igenom listan varje frame.
//--------------- // //---------------
int pickColor[2] = { r, g }; // int pickColor[2] = { r, g };
for (auto i : m_PickingColorsToEntity) { // for (auto i : m_PickingColorsToEntity) {
if(modelJob->Entity == i.second) { // if(modelJob->Entity == i.second) {
pickColor[0] = i.first.x; // pickColor[0] = i.first.x;
pickColor[1] = i.first.y; // pickColor[1] = i.first.y;
r -= 1; // r -= 1;
} // }
} // }
m_PickingColorsToEntity[glm::vec2(pickColor[0], pickColor[1])] = modelJob->Entity; // 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 // glBindVertexArray(modelJob->Model->VAO);
//TODO: Kolla upp "header/include/common" shader saken så man slipper skicka in asmycket uniforms // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->ModelMatrix)); // glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex);
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_Camera->ViewMatrix())); // r += 1;
glUniformMatrix4fv(glGetUniformLocation(ShaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_Camera->ProjectionMatrix())); // if(r > 255) {
glUniform2fv(glGetUniformLocation(ShaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1]))); // r = 0;
// g += 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; //m_PickingBuffer.Unbind();
if(r > 255) { //GLERROR("PickingPass Error");
r = 0; //}
g += 1;
}
}
}
m_PickingBuffer.Unbind();
GLERROR("PickingPass Error");
}
void Renderer::DrawScreenQuad(GLuint textureToDraw) 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 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"); 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) 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 void Renderer::InitializeFrameBuffers()//TODO: Renderer: Get this to a better location, as its really big
{ {
glGenRenderbuffers(1, &m_DepthBuffer); //glGenRenderbuffers(1, &m_DepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); //glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height); //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_Resolution.Width, m_Resolution.Height);
//
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT))); //m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_ATTACHMENT)));
m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0))); //m_PickingBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_PickingTexture, GL_COLOR_ATTACHMENT0)));
m_PickingBuffer.Generate(); //m_PickingBuffer.Generate();
} }
void Renderer::InitializeSSBOs() void Renderer::InitializeSSBOs()
@@ -399,6 +390,11 @@ void Renderer::InitializeSSBOs()
} }
void Renderer::InitializeRenderPasses()
{
m_PickingPass = new PickingPass(this);
}
void Renderer::CalculateFrustum() void Renderer::CalculateFrustum()
{ {
GLERROR("CalculateFrustum Error-1"); GLERROR("CalculateFrustum Error-1");