Initial work on texture arrays
This commit is contained in:
@@ -320,15 +320,15 @@ void DrawFinalPass::BindModelTextures(std::shared_ptr<ModelJob>& job)
|
||||
glBindTexture(GL_TEXTURE_2D, m_BlackTexture->m_Texture);
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_ShadowPass->CurrentNrOfSplits(); i++)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE4 + i);
|
||||
if (m_ShadowPass->DepthMap(i) != NULL) {
|
||||
glBindTexture(GL_TEXTURE_2D, m_ShadowPass->DepthMap(i));
|
||||
//for (int i = 0; i < m_ShadowPass->CurrentNrOfSplits(); i++)
|
||||
//{
|
||||
glActiveTexture(GL_TEXTURE4);
|
||||
if (m_ShadowPass->DepthMap() != NULL) {
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_ShadowPass->DepthMap());
|
||||
} else {
|
||||
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_WhiteTexture->m_Texture);
|
||||
}
|
||||
}
|
||||
//}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -9,6 +9,14 @@ BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLen
|
||||
m_Attachment = attachment;
|
||||
}
|
||||
|
||||
BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint layers)
|
||||
{
|
||||
m_ResourceHandle = resourceHandle;
|
||||
m_ResourceType = resourceType;
|
||||
m_Attachment = attachment;
|
||||
m_Layers = layers;
|
||||
}
|
||||
|
||||
Texture2D::~Texture2D()
|
||||
{
|
||||
if (m_ResourceHandle != 0) {
|
||||
@@ -16,6 +24,12 @@ Texture2D::~Texture2D()
|
||||
}
|
||||
}
|
||||
|
||||
Texture2DArray::~Texture2DArray()
|
||||
{
|
||||
if (m_ResourceHandle != 0) {
|
||||
glDeleteTextures(1, m_ResourceHandle);
|
||||
}
|
||||
}
|
||||
|
||||
RenderBuffer::~RenderBuffer()
|
||||
{
|
||||
@@ -48,18 +62,22 @@ void FrameBuffer::Generate()
|
||||
switch ((*it)->m_ResourceType) {
|
||||
case GL_TEXTURE_2D:
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle, 0);
|
||||
attachments.push_back((*it)->m_Attachment);
|
||||
GLERROR("FrameBuffer generate: glFramebufferTexture2D");
|
||||
break;
|
||||
case GL_RENDERBUFFER:
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle);
|
||||
GLERROR("FrameBuffer generate: glFramebufferRenderbuffer");
|
||||
break;
|
||||
case GL_TEXTURE_2D_ARRAY:
|
||||
glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0);
|
||||
attachments.push_back((*it)->m_Attachment);
|
||||
GLERROR("FrameBuffer generate: GL_TEXTURE_2D_ARRAY");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if ((*it)->m_ResourceType == GL_TEXTURE_2D) {
|
||||
attachments.push_back((*it)->m_Attachment);
|
||||
}
|
||||
}
|
||||
|
||||
GLenum* bufferTextures = &attachments[0];
|
||||
|
||||
@@ -136,9 +136,9 @@ void Renderer::Draw(RenderFrame& frame)
|
||||
if (m_DebugTextureToDraw == 4) {
|
||||
m_DrawScreenQuadPass->Draw(m_PickingPass->PickingTexture());
|
||||
}
|
||||
if (m_DebugTextureToDraw == 5) {
|
||||
m_DrawScreenQuadPass->Draw(m_ShadowPass->DepthMap(0));
|
||||
}
|
||||
//if (m_DebugTextureToDraw == 5) {
|
||||
// m_DrawScreenQuadPass->Draw(m_ShadowPass->DepthMap());
|
||||
//}
|
||||
|
||||
m_ImGuiRenderPass->Draw();
|
||||
glfwSwapBuffers(m_Window);
|
||||
|
||||
@@ -106,26 +106,37 @@ float ShadowPass::FindRadius(Frustum& frustum)
|
||||
|
||||
void ShadowPass::InitializeFrameBuffers()
|
||||
{
|
||||
// Depth texture
|
||||
glGenTextures(m_CurrentNrOfSplits, m_DepthMap.data());
|
||||
GLERROR("depthMap failed PRE");
|
||||
// Depth texture
|
||||
glGenTextures(1, &m_DepthMap);
|
||||
|
||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||
glBindTexture(GL_TEXTURE_2D, m_DepthMap[i]);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth / (1 /*+ i*/), m_ResolutionSizeHeigth + (1 /*+ i*/), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, glm::vec4(1.f).data);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||
//glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
|
||||
GLERROR("depthMap failed1");
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
||||
GLERROR("depthMap failed2");
|
||||
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth, m_ResolutionSizeHeigth, m_CurrentNrOfSplits);
|
||||
GLERROR("depthMap failed3");
|
||||
|
||||
m_DepthBuffer[i].AddResource(std::shared_ptr<BufferResource>(new Texture2D(&m_DepthMap[i], GL_DEPTH_ATTACHMENT)));
|
||||
m_DepthBuffer[i].Generate();
|
||||
}
|
||||
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeigth, m_CurrentNrOfSplits, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
GLERROR("depthMap failed4");
|
||||
|
||||
GLERROR("depthMap failed");
|
||||
//for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||
// glBindTexture(GL_TEXTURE_2D, m_DepthMap[i]);
|
||||
// glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, m_ResolutionSizeWidth / (1 /*+ i*/), m_ResolutionSizeHeigth + (1 /*+ i*/), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
|
||||
glTexParameterfv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BORDER_COLOR, glm::vec4(1.f).data);
|
||||
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
|
||||
//glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
|
||||
GLERROR("depthMap failed5");
|
||||
|
||||
m_DepthBuffer.AddResource(std::shared_ptr<BufferResource>(new Texture2DArray(&m_DepthMap, GL_DEPTH_ATTACHMENT, m_CurrentNrOfSplits)));
|
||||
m_DepthBuffer.Generate();
|
||||
//}
|
||||
|
||||
GLERROR("depthMap failed END");
|
||||
}
|
||||
|
||||
void ShadowPass::InitializeShaderPrograms()
|
||||
@@ -141,10 +152,10 @@ void ShadowPass::InitializeShaderPrograms()
|
||||
void ShadowPass::ClearBuffer()
|
||||
{
|
||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||
m_DepthBuffer[i].Bind();
|
||||
m_DepthBuffer.Bind();
|
||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
m_DepthBuffer[i].Unbind();
|
||||
m_DepthBuffer.Unbind();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,7 +203,7 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward(), scene.Camera->ProjectionMatrix(), scene.Camera->ViewMatrix());
|
||||
//float test = FindRadius(m_shadFrusta[i]);
|
||||
|
||||
ShadowPassState* state = new ShadowPassState(m_DepthBuffer[i].GetHandle());
|
||||
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
||||
|
||||
GLuint shaderHandle = m_ShadowProgram->GetHandle();
|
||||
m_ShadowProgram->Bind();
|
||||
@@ -230,7 +241,7 @@ void ShadowPass::Draw(RenderScene & scene)
|
||||
GLERROR("Shadow Draw ERROR");
|
||||
}
|
||||
}
|
||||
m_DepthBuffer[i].Unbind();
|
||||
m_DepthBuffer.Unbind();
|
||||
|
||||
delete state;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user