diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
index 067745e..6b9b1e0 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj
@@ -207,6 +207,7 @@
+
diff --git a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
index b1f6c86..07da7a6 100644
--- a/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
+++ b/ArchitectureColoredPainting/ArchitectureColoredPainting.vcxproj.filters
@@ -465,6 +465,7 @@
Resource Files\Shaders
+
diff --git a/ArchitectureColoredPainting/res/MainWindow.qrc b/ArchitectureColoredPainting/res/MainWindow.qrc
index b8f1631..af9f79c 100644
--- a/ArchitectureColoredPainting/res/MainWindow.qrc
+++ b/ArchitectureColoredPainting/res/MainWindow.qrc
@@ -33,6 +33,7 @@
Shaders/brdf_lut.comp
Shaders/pageId_downsample.comp
Shaders/tone_mapping.comp
+ Shaders/painting_shadow.frag
qt.conf
diff --git a/ArchitectureColoredPainting/res/Shaders/model.frag b/ArchitectureColoredPainting/res/Shaders/model.frag
index df9c1e5..9588598 100644
--- a/ArchitectureColoredPainting/res/Shaders/model.frag
+++ b/ArchitectureColoredPainting/res/Shaders/model.frag
@@ -46,12 +46,15 @@ void main()
if(gBaseColor.a<0.4)
discard;
gPosition = WorldPos;
+
if(texture_normal_available)
gNormal = getNormalFromMap();
else
gNormal = Normal;
if(!gl_FrontFacing)
gNormal = -gNormal;
+ gNormal = normalize(gNormal) / 2. + vec3(0.5);
+
if(texture_metallic_roughness_available)
gMetallicRoughness = texture(texture_metallic_roughness, TexCoords).bg;
else
diff --git a/ArchitectureColoredPainting/res/Shaders/model_shadow.frag b/ArchitectureColoredPainting/res/Shaders/model_shadow.frag
index 308e92b..241a231 100644
--- a/ArchitectureColoredPainting/res/Shaders/model_shadow.frag
+++ b/ArchitectureColoredPainting/res/Shaders/model_shadow.frag
@@ -7,11 +7,7 @@ in vec2 TexCoords;
void main()
{
- vec4 baseColor;// = texture(texture_basecolor, TexCoords);
- float lod = textureQueryLod(texture_basecolor, TexCoords).x;
- while(!sparseTexelsResidentARB(sparseTextureLodARB(texture_basecolor, TexCoords, lod, baseColor))&&loddraw(paintingProgram);
}
-void Model::drawShadow(QOpenGLShaderProgram* shadowProgram)
+void Model::drawShadow(QOpenGLShaderProgram* shadowProgram, QOpenGLShaderProgram* paintingShadowProgram)
{
for (auto& mesh : meshes)
mesh->drawShadow(shadowProgram);
for (auto& mesh : paintingMeshes)
- mesh->drawShadow(shadowProgram);
+ mesh->drawShadow(paintingShadowProgram);
}
void Renderer::Model::loadModel(QString path)
diff --git a/ArchitectureColoredPainting/src/Renderer/Model.h b/ArchitectureColoredPainting/src/Renderer/Model.h
index 22b69ad..87863d8 100644
--- a/ArchitectureColoredPainting/src/Renderer/Model.h
+++ b/ArchitectureColoredPainting/src/Renderer/Model.h
@@ -13,7 +13,7 @@ namespace Renderer
public:
Model(QOpenGLContext* context, VirtualTextureManager* vtManager);
void draw(QOpenGLShaderProgram* shaderProgram, QOpenGLShaderProgram* paintingProgram);
- void drawShadow(QOpenGLShaderProgram* shadowProgram);
+ void drawShadow(QOpenGLShaderProgram* shadowProgram, QOpenGLShaderProgram* paintingShadowProgram);
void loadModel(QString path);
void unloadModel();
const std::unordered_map>& getPaintingMap();
diff --git a/ArchitectureColoredPainting/src/Renderer/PaintingMesh.cpp b/ArchitectureColoredPainting/src/Renderer/PaintingMesh.cpp
index 2982e15..3d0610e 100644
--- a/ArchitectureColoredPainting/src/Renderer/PaintingMesh.cpp
+++ b/ArchitectureColoredPainting/src/Renderer/PaintingMesh.cpp
@@ -28,8 +28,6 @@ void PaintingMesh::drawShadow(QOpenGLShaderProgram* shadowProgram)
{
if (shadowProgram->bind())
{
- glFunc->glBindTextureUnit(0, textureBasecolor);
- shadowProgram->setUniformValue("texture_basecolor", 0);
QOpenGLVertexArrayObject::Binder bind(&VAO);
shadowProgram->setUniformValue("model", model);
EBO.bind();
diff --git a/ArchitectureColoredPainting/src/Renderer/RenderPass.cpp b/ArchitectureColoredPainting/src/Renderer/RenderPass.cpp
index 4ee3196..a16e974 100644
--- a/ArchitectureColoredPainting/src/Renderer/RenderPass.cpp
+++ b/ArchitectureColoredPainting/src/Renderer/RenderPass.cpp
@@ -7,16 +7,14 @@ namespace Renderer
ShadowMapPass::ShadowMapPass(GladGLContext* gl, GLuint& shadowFboHandle, int& shadowMapResolution, Light& light, Model*& model)
: RenderPass(gl)
, modelShadowShader(":/Shaders/model_shadow.vert", ":/Shaders/model_shadow.frag", ":/Shaders/model_shadow.geom")
+ , paintingShadowShader(":/Shaders/model_shadow.vert", ":/Shaders/painting_shadow.frag", ":/Shaders/model_shadow.geom")
, shadowFboHandle(shadowFboHandle), shadowMapResolution(shadowMapResolution), light(light), model(model)
{
- modelShadowShader.bind();
- gl->GenBuffers(1, &lightSpaceMatricesUBO);
- gl->BindBuffer(GL_UNIFORM_BUFFER, lightSpaceMatricesUBO);
- gl->BufferData(GL_UNIFORM_BUFFER, sizeof(QMatrix4x4) * 16, nullptr, GL_STATIC_DRAW);
+ gl->CreateBuffers(1, &lightSpaceMatricesUBO);
+ gl->NamedBufferData(lightSpaceMatricesUBO, sizeof(QMatrix4x4) * 16, nullptr, GL_STATIC_DRAW);
gl->BindBufferBase(GL_UNIFORM_BUFFER, 0, lightSpaceMatricesUBO);
- gl->BindBuffer(GL_UNIFORM_BUFFER, 0);
- modelShadowShader.release();
}
+
void ShadowMapPass::dispatch()
{
const std::vector lightMatrices = light.getLightSpaceMatrices();
@@ -32,7 +30,7 @@ namespace Renderer
gl->Clear(GL_DEPTH_BUFFER_BIT);
//gl->CullFace(GL_FRONT);
if (model != nullptr)
- model->drawShadow(&modelShadowShader);
+ model->drawShadow(&modelShadowShader, &paintingShadowShader);
//gl->CullFace(GL_BACK);
gl->BindFramebuffer(GL_FRAMEBUFFER, 0);
diff --git a/ArchitectureColoredPainting/src/Renderer/RenderPass.h b/ArchitectureColoredPainting/src/Renderer/RenderPass.h
index 83d353c..3a690a1 100644
--- a/ArchitectureColoredPainting/src/Renderer/RenderPass.h
+++ b/ArchitectureColoredPainting/src/Renderer/RenderPass.h
@@ -25,7 +25,7 @@ namespace Renderer
ShadowMapPass(GladGLContext* gl, GLuint& shadowFboHandle, int& shadowMapResolution, Light& light, Model*& model);
void dispatch();
private:
- Shader modelShadowShader;
+ Shader modelShadowShader, paintingShadowShader;
GLuint& shadowFboHandle;
int& shadowMapResolution;
Light& light;
diff --git a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp
index 18ee32e..476f360 100644
--- a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp
+++ b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp
@@ -207,12 +207,12 @@ void RendererGLWidget::paintGL()
projection = camera.GetProjectionMatrix();
view = camera.GetViewMatrix();
- vtManager->commitMutex.lock();
+ //vtManager->commitMutex.lock();
shadowMapPass->dispatch();
geometryPass->dispatch();
pageIDCallbackPass->dispatch();
- gl->Finish();
- vtManager->commitMutex.unlock();
+ //gl->Finish();
+ //vtManager->commitMutex.unlock();
lightingPass->dispatch();
skyboxPass->dispatch();
toneMappingPass->dispatch();
@@ -265,8 +265,6 @@ void RendererGLWidget::resizeGL(int width, int height)
frameHeight = ceil(devicePixelRatioF() * height);
qDebug() << frameWidth << "x" << frameHeight;
camera.Ratio = (float)frameWidth / (float)frameHeight;
- //qDebug() << devicePixelRatioF() << width << height;
- //gl->Viewport(0, 0, (GLint)devicePixelRatio()*width, (GLint)devicePixelRatio()*height);
if (fboPtr != nullptr)
{
@@ -286,7 +284,7 @@ void RendererGLWidget::resizeGL(int width, int height)
gl->GenTextures(9, gbuffers + 1);
//Normal
gl->BindTexture(GL_TEXTURE_2D, gbuffers[1]);
- gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, frameWidth, frameHeight, 0, GL_RGB, GL_FLOAT, NULL);
+ gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGB10, frameWidth, frameHeight, 0, GL_RGB, GL_UNSIGNED_INT, NULL);
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gbuffers[1], 0);
@@ -314,7 +312,7 @@ void RendererGLWidget::resizeGL(int width, int height)
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT5, GL_TEXTURE_2D, gbuffers[5], 0);
- //Depth, Deprecated
+ //Depth
gl->BindTexture(GL_TEXTURE_2D, gbuffers[6]);
gl->TexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, frameWidth, frameHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@@ -326,7 +324,6 @@ void RendererGLWidget::resizeGL(int width, int height)
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5 };
gl->DrawBuffers(6, attachments);
- //gbuffers = fboPtr->textures();
if (gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
qDebug() << "Framebuffer not complete!";
@@ -365,8 +362,7 @@ void RendererGLWidget::resizeGL(int width, int height)
gl->DeleteFramebuffers(1, &shadowFboHandle);
}
- //shadowMapResolution = 1.5 * std::max(frameWidth, frameHeight);
- shadowMapResolution = 2048;
+ shadowMapResolution = std::min(2048u, qNextPowerOfTwo(static_cast(std::max(frameWidth, frameHeight) * 3.8)));
gl->GenFramebuffers(1, &shadowFboHandle);
{
gl->BindFramebuffer(GL_FRAMEBUFFER, shadowFboHandle);