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);