MSAA is now working

This commit is contained in:
Teejoon
2016-03-12 22:22:53 +01:00
parent 70b0ca8776
commit 5146d21173
13 changed files with 139 additions and 80 deletions
+3 -2
View File
@@ -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;
+1
View File
@@ -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;
+2
View File
@@ -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;
+3
View File
@@ -85,3 +85,6 @@ NumIterations=9
[GLOW3]
NumIterations=13
[MSAA]
Level = 0;
+1
View File
@@ -10,5 +10,6 @@
<KeepRatioY>false</KeepRatioY>
<KeepRatio>false</KeepRatio>
<Linear>true</Linear>
<ClampToBorder>false</ClampToBorder>
<BlurBackground>false</BlurBackground>
</Sprite>
+3
View File
@@ -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>
+2 -4
View File
@@ -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;
}
+2 -4
View File
@@ -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;
}
+18 -18
View File
@@ -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);
}
+64 -16
View File
@@ -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);
}
+4
View File
@@ -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;
}
+3 -1
View File
@@ -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);
+16 -18
View File
@@ -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");