MSAA is now working
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
class DrawFinalPass
|
||||
{
|
||||
public:
|
||||
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass);
|
||||
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config);
|
||||
~DrawFinalPass();
|
||||
void InitializeTextures();
|
||||
void InitializeFrameBuffers();
|
||||
@@ -25,6 +25,7 @@ public:
|
||||
void Draw(RenderScene& scene, BlurHUD* blurHUDPass);
|
||||
void ClearBuffer();
|
||||
void OnWindowResize();
|
||||
void setMSAA(unsigned int numberOfSamples);
|
||||
|
||||
//Return the texture that is used in later stages to apply the bloom effect
|
||||
GLuint BloomTexture() {
|
||||
@@ -129,7 +130,7 @@ private:
|
||||
|
||||
//maqke this component based i guess?
|
||||
GLuint m_ShieldPixelRate = 16;
|
||||
unsigned int m_MSAA = 4;
|
||||
unsigned int m_MSAA = 0;
|
||||
|
||||
const IRenderer* m_Renderer;
|
||||
const LightCullingPass* m_LightCullingPass;
|
||||
|
||||
@@ -71,6 +71,7 @@ private:
|
||||
bool m_ResizeWindow = false;
|
||||
int m_SSAO_Quality = 0;
|
||||
int m_GLOW_Quality = 2;
|
||||
unsigned int m_MSAA_Level = 0;
|
||||
|
||||
PickingPass* m_PickingPass;
|
||||
LightCullingPass* m_LightCullingPass;
|
||||
|
||||
@@ -29,6 +29,7 @@ struct SpriteJob : RenderJob
|
||||
IncandescenceTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["GlowMap"]);
|
||||
|
||||
Linear = (bool)cSprite["Linear"];
|
||||
ClampToBorder = (bool)cSprite["ClampToBorder"];
|
||||
|
||||
StartIndex = matProp.material->StartIndex;
|
||||
EndIndex = matProp.material->EndIndex;
|
||||
@@ -93,6 +94,7 @@ struct SpriteJob : RenderJob
|
||||
float ScaleX = 1;
|
||||
float ScaleY = 1;
|
||||
bool Linear = false;
|
||||
bool ClampToBorder = false;
|
||||
|
||||
glm::vec4 FillColor = glm::vec4(0);
|
||||
float FillPercentage = 0.0;
|
||||
|
||||
@@ -85,3 +85,6 @@ NumIterations=9
|
||||
|
||||
[GLOW3]
|
||||
NumIterations=13
|
||||
|
||||
[MSAA]
|
||||
Level = 0;
|
||||
@@ -10,5 +10,6 @@
|
||||
<KeepRatioY>false</KeepRatioY>
|
||||
<KeepRatio>false</KeepRatio>
|
||||
<Linear>true</Linear>
|
||||
<ClampToBorder>false</ClampToBorder>
|
||||
<BlurBackground>false</BlurBackground>
|
||||
</Sprite>
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
<xs:element name="Linear" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>If it should use Linear or Nearest sampling method.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="ClampToBorder" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>If it should clamp to border or repeat the texture.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="BlurBackground" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Wether the background should be blurred begind this sprite.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#version 430
|
||||
|
||||
uniform mat4 M;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 PVM;
|
||||
|
||||
layout (location = 0) in vec3 Position;
|
||||
layout (location = 4) in vec2 TextureCoords;
|
||||
@@ -13,6 +11,6 @@ out VertexData{
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = P * V * M * vec4(Position, 1.0);
|
||||
gl_Position = PVM * vec4(Position, 1.0);
|
||||
Output.TextureCoordinate = TextureCoords;
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
#version 430
|
||||
|
||||
uniform mat4 M;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
uniform mat4 PVM;
|
||||
uniform mat4 Bones[100];
|
||||
|
||||
layout (location = 0) in vec3 Position;
|
||||
@@ -24,6 +22,6 @@ void main()
|
||||
+ BoneWeights[3] * Bones[int(BoneIndices[3])];
|
||||
}
|
||||
|
||||
gl_Position = P * V * M * boneTransform * vec4(Position, 1.0);
|
||||
gl_Position = PVM * boneTransform * vec4(Position, 1.0);
|
||||
Output.TextureCoordinate = TextureCoords;
|
||||
}
|
||||
@@ -68,13 +68,13 @@ void BlurHUD::InitializeBuffers()
|
||||
}
|
||||
m_GaussianFrameBuffer_horiz.Generate();
|
||||
|
||||
CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||
res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
||||
//CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||
// res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
||||
CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_NEAREST,
|
||||
res2, GL_RGBA16F, GL_RGBA, GL_FLOAT);
|
||||
|
||||
if (m_GaussianFrameBuffer_vert.GetHandle() == 0) {
|
||||
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthStencil_vert, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthStencil_horiz, GL_DEPTH_STENCIL_ATTACHMENT)));
|
||||
m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0)));
|
||||
}
|
||||
m_GaussianFrameBuffer_vert.Generate();
|
||||
@@ -260,22 +260,22 @@ void BlurHUD::FillStencil(RenderScene& scene)
|
||||
glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
||||
}
|
||||
|
||||
state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle());
|
||||
for (auto& job : scene.Jobs.SpriteJob) {
|
||||
auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
||||
if (!spriteJob) {
|
||||
continue;
|
||||
}
|
||||
if(!spriteJob->BlurBackground) {
|
||||
continue;
|
||||
}
|
||||
glm::mat4 MVP = VP * spriteJob->Matrix;
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP));
|
||||
//state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle());
|
||||
//for (auto& job : scene.Jobs.SpriteJob) {
|
||||
// auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
||||
// if (!spriteJob) {
|
||||
// continue;
|
||||
// }
|
||||
// if(!spriteJob->BlurBackground) {
|
||||
// continue;
|
||||
// }
|
||||
// glm::mat4 MVP = VP * spriteJob->Matrix;
|
||||
// glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP));
|
||||
|
||||
glBindVertexArray(spriteJob->Model->VAO);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer);
|
||||
glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
||||
}
|
||||
// glBindVertexArray(spriteJob->Model->VAO);
|
||||
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer);
|
||||
// glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int)));
|
||||
//}
|
||||
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "Rendering/DrawFinalPass.h"
|
||||
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass)
|
||||
DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config)
|
||||
: m_Renderer(renderer)
|
||||
, m_LightCullingPass(lightCullingPass)
|
||||
, m_CubeMapPass(cubeMapPass)
|
||||
@@ -11,6 +11,8 @@ DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCulling
|
||||
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||
m_ShieldDepthFrameBuffer = new FrameBuffer();
|
||||
|
||||
setMSAA(config->Get<int>("MSAA.Level", 0));
|
||||
|
||||
InitializeTextures();
|
||||
InitializeShaderPrograms();
|
||||
InitializeFrameBuffers();
|
||||
@@ -48,21 +50,35 @@ void DrawFinalPass::InitializeFrameBuffers()
|
||||
}
|
||||
m_AntiAliasedFrameBuffer->Generate();
|
||||
|
||||
if (m_SceneTexture != 0) {
|
||||
glDeleteRenderbuffers(1, &m_SceneTexture);
|
||||
}
|
||||
glGenRenderbuffers(1, &m_SceneTexture);
|
||||
GLERROR("FBO 1");
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_SceneTexture);
|
||||
GLERROR("FBO 11");
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
GLERROR("FBO 111");
|
||||
|
||||
if (m_BloomTexture != 0) {
|
||||
glDeleteRenderbuffers(1, &m_BloomTexture);
|
||||
}
|
||||
glGenRenderbuffers(1, &m_BloomTexture);
|
||||
GLERROR("FBO 2");
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_BloomTexture);
|
||||
GLERROR("FBO 22");
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
GLERROR("FBO 222");
|
||||
|
||||
if (m_DepthBuffer != 0) {
|
||||
glDeleteRenderbuffers(1, &m_DepthBuffer);
|
||||
}
|
||||
glGenRenderbuffers(1, &m_DepthBuffer);
|
||||
GLERROR("FBO 3");
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer);
|
||||
GLERROR("FBO 33");
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
|
||||
glGenRenderbuffers(1, &m_ShieldBuffer);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, m_ShieldBuffer);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH_COMPONENT32F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||
GLERROR("FBO 333");
|
||||
|
||||
//CommonFunctions::GenerateMultiSampleTexture(&m_SceneTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F);
|
||||
//CommonFunctions::GenerateMultiSampleTexture(&m_BloomTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F);
|
||||
@@ -81,10 +97,10 @@ void DrawFinalPass::InitializeFrameBuffers()
|
||||
|
||||
CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
|
||||
}
|
||||
|
||||
CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST,
|
||||
glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT);
|
||||
}
|
||||
|
||||
if (m_FinalPassFrameBuffer->GetHandle() == 0) {
|
||||
if (m_MSAA) {
|
||||
@@ -103,12 +119,8 @@ void DrawFinalPass::InitializeFrameBuffers()
|
||||
GLERROR("FBO generation");
|
||||
|
||||
if (m_ShieldDepthFrameBuffer->GetHandle() == 0) {
|
||||
if (m_MSAA) {
|
||||
m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new RenderBuffer(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT)));
|
||||
} else {
|
||||
m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT)));
|
||||
}
|
||||
}
|
||||
m_ShieldDepthFrameBuffer->Generate();
|
||||
}
|
||||
|
||||
@@ -355,15 +367,17 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass)
|
||||
m_FullBlurredTexture = blurHUDPass->Draw(sceneTexture, scene);
|
||||
}
|
||||
|
||||
DrawFinalPassState* stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||
DrawFinalPassState* stateSprite;
|
||||
if(scene.ShouldBlur) {
|
||||
//Combine nonblur and blur texture
|
||||
GLuint sceneTexture = SceneTexture();
|
||||
stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||
stateSprite->Disable(GL_DEPTH_TEST);
|
||||
stateSprite->Disable(GL_STENCIL_TEST);
|
||||
GLuint sceneTexture = SceneTexture();
|
||||
delete stateSprite;
|
||||
stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||
m_CombinedTexture = blurHUDPass->CombineTextures(sceneTexture, m_FullBlurredTexture);
|
||||
|
||||
} else {
|
||||
stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle());
|
||||
}
|
||||
//Draw Transparen objects
|
||||
//state->BlendFunc(GL_ONE, GL_ONE);
|
||||
@@ -410,9 +424,10 @@ void DrawFinalPass::OnWindowResize()
|
||||
m_ShieldDepthFrameBuffer = new FrameBuffer();
|
||||
}
|
||||
|
||||
if (!m_MSAA) {
|
||||
if (m_MSAA) {
|
||||
if (m_AntiAliasedFrameBuffer != nullptr) {
|
||||
delete m_AntiAliasedFrameBuffer;
|
||||
m_AntiAliasedFrameBuffer = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -420,6 +435,32 @@ void DrawFinalPass::OnWindowResize()
|
||||
GLERROR("Error changing texture resolutions");
|
||||
}
|
||||
|
||||
void DrawFinalPass::setMSAA(unsigned int numberOfSamples) {
|
||||
if (m_MSAA == numberOfSamples) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(bool)numberOfSamples) {
|
||||
if (m_AntiAliasedFrameBuffer != nullptr) {
|
||||
delete m_AntiAliasedFrameBuffer;
|
||||
m_AntiAliasedFrameBuffer = nullptr;
|
||||
}
|
||||
delete m_FinalPassFrameBuffer;
|
||||
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||
}
|
||||
|
||||
if ((bool)numberOfSamples && !(bool)m_MSAA) {
|
||||
delete m_FinalPassFrameBuffer;
|
||||
m_FinalPassFrameBuffer = new FrameBuffer();
|
||||
}
|
||||
|
||||
m_MSAA = numberOfSamples;
|
||||
|
||||
InitializeFrameBuffers();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
||||
{
|
||||
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
||||
@@ -1366,7 +1407,14 @@ void DrawFinalPass::DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, Rend
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
}
|
||||
|
||||
if (spriteJob->ClampToBorder) {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||
}
|
||||
else {
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
}
|
||||
} else {
|
||||
glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ Texture2D::~Texture2D()
|
||||
if (m_ResourceHandle != 0) {
|
||||
glDeleteTextures(1, m_ResourceHandle);
|
||||
}
|
||||
*m_ResourceHandle = 0;
|
||||
}
|
||||
|
||||
Texture2DMultiSample::~Texture2DMultiSample()
|
||||
@@ -23,6 +24,7 @@ Texture2DMultiSample::~Texture2DMultiSample()
|
||||
if (m_ResourceHandle != 0) {
|
||||
glDeleteTextures(1, m_ResourceHandle);
|
||||
}
|
||||
*m_ResourceHandle = 0;
|
||||
}
|
||||
|
||||
RenderBuffer::~RenderBuffer()
|
||||
@@ -30,6 +32,7 @@ RenderBuffer::~RenderBuffer()
|
||||
if (m_ResourceHandle != 0) {
|
||||
glDeleteRenderbuffers(1, m_ResourceHandle);
|
||||
}
|
||||
*m_ResourceHandle = 0;
|
||||
}
|
||||
|
||||
Texture2DArray::~Texture2DArray()
|
||||
@@ -37,6 +40,7 @@ Texture2DArray::~Texture2DArray()
|
||||
if (m_ResourceHandle != 0) {
|
||||
glDeleteTextures(1, m_ResourceHandle);
|
||||
}
|
||||
*m_ResourceHandle = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -168,8 +168,10 @@ void Renderer::Draw(RenderFrame& frame)
|
||||
|
||||
ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3);
|
||||
ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3);
|
||||
ImGui::SliderInt("MSAA Level", (int*)&m_MSAA_Level, 0, 16);
|
||||
m_SSAOPass->ChangeQuality(m_SSAO_Quality);
|
||||
m_DrawBloomPass->ChangeQuality(m_GLOW_Quality);
|
||||
m_DrawFinalPass->setMSAA(m_MSAA_Level);
|
||||
GLERROR("SSAO Settings");
|
||||
//clear buffer 0
|
||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||
@@ -308,7 +310,7 @@ void Renderer::InitializeRenderPasses()
|
||||
m_SSAOPass = new SSAOPass(this, m_Config);
|
||||
m_ShadowPass = new ShadowPass(this);
|
||||
m_BlurHUDPass = new BlurHUD(this);
|
||||
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass);
|
||||
m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass, m_Config);
|
||||
m_DrawScreenQuadPass = new DrawScreenQuadPass(this);
|
||||
m_DrawBloomPass = new DrawBloomPass(this, m_Config);
|
||||
m_DrawColorCorrectionPass = new DrawColorCorrectionPass(this);
|
||||
|
||||
@@ -226,8 +226,8 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||
|
||||
|
||||
GLuint shaderHandle;
|
||||
|
||||
GLuint shaderHandle = 0;
|
||||
GLuint lastModel = 0;
|
||||
for (auto &job : scene.Jobs.DirectionalLight) {
|
||||
|
||||
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||
@@ -240,19 +240,6 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
//RadiusToLightspace(m_shadowFrusta[i]);
|
||||
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
|
||||
|
||||
|
||||
m_ShadowProgram->Bind();
|
||||
shaderHandle = m_ShadowProgram->GetHandle();
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||
|
||||
m_ShadowProgramSkinned->Bind();
|
||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||
|
||||
|
||||
|
||||
GLERROR("ShadowLight ERROR");
|
||||
|
||||
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
||||
@@ -264,8 +251,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
}
|
||||
|
||||
if(modelJob->Model->IsSkinned()) {
|
||||
if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) {
|
||||
m_ShadowProgramSkinned->Bind();
|
||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||
}
|
||||
|
||||
std::vector<glm::mat4> frameBones;
|
||||
if (modelJob->BlendTree != nullptr) {
|
||||
@@ -276,15 +265,19 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||
|
||||
} else {
|
||||
if (shaderHandle != m_ShadowProgram->GetHandle()) {
|
||||
m_ShadowProgram->Bind();
|
||||
shaderHandle = m_ShadowProgram->GetHandle();
|
||||
}
|
||||
}
|
||||
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix));
|
||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
||||
|
||||
if (lastModel != modelJob->ModelID) {
|
||||
glBindVertexArray(modelJob->Model->VAO);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||
}
|
||||
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||
|
||||
GLERROR("Shadow Draw ERROR");
|
||||
@@ -301,8 +294,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
}
|
||||
|
||||
if (modelJob->Model->IsSkinned()) {
|
||||
if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) {
|
||||
m_ShadowProgramSkinned->Bind();
|
||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||
}
|
||||
|
||||
std::vector<glm::mat4> frameBones;
|
||||
if (modelJob->BlendTree != nullptr) {
|
||||
@@ -313,11 +308,13 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||
|
||||
} else {
|
||||
if (shaderHandle != m_ShadowProgram->GetHandle()) {
|
||||
m_ShadowProgram->Bind();
|
||||
shaderHandle = m_ShadowProgram->GetHandle();
|
||||
}
|
||||
}
|
||||
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix));
|
||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
||||
|
||||
if (m_TexturedShadows) {
|
||||
@@ -345,9 +342,10 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lastModel != modelJob->ModelID) {
|
||||
glBindVertexArray(modelJob->Model->VAO);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||
}
|
||||
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||
|
||||
GLERROR("Shadow Draw ERROR");
|
||||
|
||||
Reference in New Issue
Block a user