WIP stencil stuff
This commit is contained in:
@@ -22,9 +22,13 @@ public:
|
|||||||
|
|
||||||
//Return the texture that is used in later stages to apply the bloom effect
|
//Return the texture that is used in later stages to apply the bloom effect
|
||||||
GLuint BloomTexture() const { return m_BloomTexture; }
|
GLuint BloomTexture() const { return m_BloomTexture; }
|
||||||
|
GLuint BloomTextureLowRes() const { return m_BloomTextureLowRes; }
|
||||||
//Return the texture with diffuse and lighting of the scene.
|
//Return the texture with diffuse and lighting of the scene.
|
||||||
GLuint SceneTexture() const { return m_SceneTexture; }
|
GLuint SceneTexture() const { return m_SceneTexture; }
|
||||||
|
GLuint SceneTextureLowRes() const { return m_SceneTextureLowRes; }
|
||||||
|
//Return the framebuffer used in the scene rendering stage.
|
||||||
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
|
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
|
||||||
|
FrameBuffer* FinalPassFrameBufferLowRes() { return &m_FinalPassFrameBufferLowRes; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -47,10 +51,12 @@ private:
|
|||||||
Texture* m_GreyTexture;
|
Texture* m_GreyTexture;
|
||||||
|
|
||||||
FrameBuffer m_FinalPassFrameBuffer;
|
FrameBuffer m_FinalPassFrameBuffer;
|
||||||
|
FrameBuffer m_FinalPassFrameBufferLowRes;
|
||||||
GLuint m_BloomTexture;
|
GLuint m_BloomTexture;
|
||||||
GLuint m_SceneTexture;
|
GLuint m_SceneTexture;
|
||||||
|
GLuint m_BloomTextureLowRes;
|
||||||
|
GLuint m_SceneTextureLowRes;
|
||||||
GLuint m_DepthBuffer;
|
GLuint m_DepthBuffer;
|
||||||
GLuint m_StencilBuffer;
|
|
||||||
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
const LightCullingPass* m_LightCullingPass;
|
const LightCullingPass* m_LightCullingPass;
|
||||||
|
|||||||
@@ -22,18 +22,33 @@ void DrawFinalPass::InitializeFrameBuffers()
|
|||||||
glGenRenderbuffers(1, &m_DepthBuffer);
|
glGenRenderbuffers(1, &m_DepthBuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
GLERROR("RenderBuffer generation");
|
||||||
|
|
||||||
GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
//GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
//GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
//GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4);
|
//GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4);
|
||||||
|
//GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT);
|
||||||
|
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||||
|
//m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT)));
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0)));
|
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0)));
|
||||||
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1)));
|
m_FinalPassFrameBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1)));
|
||||||
m_FinalPassFrameBuffer.Generate();
|
m_FinalPassFrameBuffer.Generate();
|
||||||
GLERROR("FBO generation");
|
GLERROR("FBO generation");
|
||||||
|
|
||||||
|
GenerateTexture(&m_SceneTextureLowRes, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width/16, m_Renderer->GetViewportSize().Height/16), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
//GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
GenerateTexture(&m_BloomTextureLowRes, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width/16, m_Renderer->GetViewportSize().Height/16), GL_RGB16F, GL_RGB, GL_FLOAT);
|
||||||
|
//GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4);
|
||||||
|
//GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT);
|
||||||
|
|
||||||
|
m_FinalPassFrameBufferLowRes.AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||||
|
//m_FinalPassFrameBufferLowRes.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT)));
|
||||||
|
m_FinalPassFrameBufferLowRes.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_SceneTextureLowRes, GL_COLOR_ATTACHMENT0)));
|
||||||
|
m_FinalPassFrameBufferLowRes.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_BloomTextureLowRes, GL_COLOR_ATTACHMENT1)));
|
||||||
|
m_FinalPassFrameBufferLowRes.Generate();
|
||||||
|
GLERROR("FBO2 generation");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawFinalPass::InitializeShaderPrograms()
|
void DrawFinalPass::InitializeShaderPrograms()
|
||||||
@@ -93,7 +108,7 @@ void DrawFinalPass::Draw(RenderScene& scene)
|
|||||||
|
|
||||||
//Draw Opaque shielded objects
|
//Draw Opaque shielded objects
|
||||||
state->StencilFunc(GL_NOTEQUAL, 1, 0xFF);
|
state->StencilFunc(GL_NOTEQUAL, 1, 0xFF);
|
||||||
glStencilMask(0x00);
|
state->StencilMask(0x00);
|
||||||
DrawShieldedModelRenderQueue(scene.Jobs.OpaqueShieldedObjects, scene);
|
DrawShieldedModelRenderQueue(scene.Jobs.OpaqueShieldedObjects, scene);
|
||||||
GLERROR("Shielded Opaque object");
|
GLERROR("Shielded Opaque object");
|
||||||
|
|
||||||
@@ -103,7 +118,26 @@ void DrawFinalPass::Draw(RenderScene& scene)
|
|||||||
|
|
||||||
GLERROR("END");
|
GLERROR("END");
|
||||||
delete state;
|
delete state;
|
||||||
//delete stencilState;
|
|
||||||
|
|
||||||
|
DrawFinalPassState* stateLowRes = new DrawFinalPassState(m_FinalPassFrameBufferLowRes.GetHandle());
|
||||||
|
//Draw the lowres texture that will be shown behind the shield.
|
||||||
|
if (scene.ClearDepth) {
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
//TODO: Do we need check for this or will it be per scene always?
|
||||||
|
//glClearStencil(0x00);
|
||||||
|
//glClear(GL_STENCIL_BUFFER_BIT);
|
||||||
|
|
||||||
|
//state->StencilMask(0x00);
|
||||||
|
//state->StencilFunc(GL_ALWAYS, 1, 0xFF);
|
||||||
|
state->Disable(GL_STENCIL_TEST);
|
||||||
|
state->Disable(GL_DEPTH_TEST);
|
||||||
|
DrawModelRenderQueues(scene.Jobs.OpaqueObjects, scene);
|
||||||
|
GLERROR("OpaqueObjects");
|
||||||
|
DrawModelRenderQueues(scene.Jobs.TransparentObjects, scene);
|
||||||
|
GLERROR("TransparentObjects");
|
||||||
|
delete stateLowRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -113,6 +147,11 @@ void DrawFinalPass::ClearBuffer()
|
|||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
m_FinalPassFrameBuffer.Unbind();
|
m_FinalPassFrameBuffer.Unbind();
|
||||||
|
|
||||||
|
m_FinalPassFrameBufferLowRes.Bind();
|
||||||
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
m_FinalPassFrameBufferLowRes.Unbind();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawFinalPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const
|
void DrawFinalPass::GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const
|
||||||
|
|||||||
@@ -39,10 +39,13 @@ void FrameBuffer::AddResource(std::shared_ptr<BufferResource> resource)
|
|||||||
|
|
||||||
void FrameBuffer::Generate()
|
void FrameBuffer::Generate()
|
||||||
{
|
{
|
||||||
|
GLERROR("PRE");
|
||||||
|
|
||||||
std::vector<GLenum> attachments;
|
std::vector<GLenum> attachments;
|
||||||
|
|
||||||
glGenFramebuffers(1, &m_BufferHandle);
|
glGenFramebuffers(1, &m_BufferHandle);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle);
|
||||||
|
GLERROR("1");
|
||||||
|
|
||||||
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
|
for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) {
|
||||||
switch ((*it)->m_ResourceType) {
|
switch ((*it)->m_ResourceType) {
|
||||||
@@ -56,20 +59,30 @@ void FrameBuffer::Generate()
|
|||||||
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
GLERROR("2");
|
||||||
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT || (*it)->m_Attachment != GL_STENCIL_ATTACHMENT || (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
|
|
||||||
|
if ((*it)->m_Attachment != GL_DEPTH_ATTACHMENT && (*it)->m_Attachment != GL_STENCIL_ATTACHMENT && (*it)->m_Attachment != GL_DEPTH_STENCIL_ATTACHMENT) {
|
||||||
attachments.push_back((*it)->m_Attachment);
|
attachments.push_back((*it)->m_Attachment);
|
||||||
}
|
}
|
||||||
|
GLERROR("Attachment");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
GLERROR("3");
|
||||||
|
|
||||||
|
|
||||||
GLenum* bufferTextures = &attachments[0];
|
GLenum* bufferTextures = &attachments[0];
|
||||||
glDrawBuffers(attachments.size(), bufferTextures);
|
glDrawBuffers(attachments.size(), bufferTextures);
|
||||||
|
if(GLERROR("4")) {
|
||||||
|
printf("hello");
|
||||||
|
}
|
||||||
|
|
||||||
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
|
||||||
GLERROR("Framebuffer incomplete");
|
GLERROR("Framebuffer incomplete");
|
||||||
//LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
|
//LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
GLERROR("END");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameBuffer::Bind()
|
void FrameBuffer::Bind()
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ void Renderer::Update(double dt)
|
|||||||
|
|
||||||
void Renderer::Draw(RenderFrame& frame)
|
void Renderer::Draw(RenderFrame& frame)
|
||||||
{
|
{
|
||||||
ImGui::Combo("Draw textures", &m_DebugTextureToDraw, "Final\0Scene\0Bloom\0Gaussian\0Picking");
|
ImGui::Combo("Draw textures", &m_DebugTextureToDraw, "Final\0Scene\0Bloom\0SceneLowRes\0BloomLowRes\0Gaussian\0Picking");
|
||||||
//clear buffer 0
|
//clear buffer 0
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
@@ -129,9 +129,15 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
m_DrawScreenQuadPass->Draw(m_DrawFinalPass->BloomTexture());
|
m_DrawScreenQuadPass->Draw(m_DrawFinalPass->BloomTexture());
|
||||||
}
|
}
|
||||||
if (m_DebugTextureToDraw == 3) {
|
if (m_DebugTextureToDraw == 3) {
|
||||||
m_DrawScreenQuadPass->Draw(m_DrawBloomPass->GaussianTexture());
|
m_DrawScreenQuadPass->Draw(m_DrawFinalPass->SceneTextureLowRes());
|
||||||
}
|
}
|
||||||
if (m_DebugTextureToDraw == 4) {
|
if (m_DebugTextureToDraw == 4) {
|
||||||
|
m_DrawScreenQuadPass->Draw(m_DrawFinalPass->BloomTextureLowRes());
|
||||||
|
}
|
||||||
|
if (m_DebugTextureToDraw == 5) {
|
||||||
|
m_DrawScreenQuadPass->Draw(m_DrawBloomPass->GaussianTexture());
|
||||||
|
}
|
||||||
|
if (m_DebugTextureToDraw == 6) {
|
||||||
m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture());
|
m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user