diff options
author | Antti Määttä <antti.maatta@qt.io> | 2019-04-25 15:33:19 +0300 |
---|---|---|
committer | Antti Määttä <antti.maatta@qt.io> | 2019-05-14 11:05:25 +0000 |
commit | 8ad0905baa8fa01d30fb793686ed8fa5f0c13a03 (patch) | |
tree | 5be91515deb5998dbb30469f73108d656361325f | |
parent | 39a6846e93ad2c117be6c172e9d6f483357f2b42 (diff) |
Autogenerate mipmaps for textures
Generate mipmaps if they are missing using QT3DS_GENERATE_MIPMAPS.
Also enable anisotropic filtering and allow setting the value with
QT3DS_ANISOTROPIC_VALUE env variable.
Change-Id: I53f7ed6ec0e3ee511b4d605ba8a76d1177ced966
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
5 files changed, 23 insertions, 3 deletions
diff --git a/src/Runtime/Source/render/Qt3DSRenderTextureBase.cpp b/src/Runtime/Source/render/Qt3DSRenderTextureBase.cpp index d055d72c..c1c3e97d 100644 --- a/src/Runtime/Source/render/Qt3DSRenderTextureBase.cpp +++ b/src/Runtime/Source/render/Qt3DSRenderTextureBase.cpp @@ -136,6 +136,12 @@ namespace render { } } + static GLfloat getMaxAnisotropy() + { + static GLfloat val = (GLfloat)qEnvironmentVariableIntValue("QT3DS_ANISOTROPIC_VALUE"); + return val > 0 ? val : 1.0f; + } + void NVRenderTextureBase::applyTexParams() { if (m_SamplerParamsDirty) { @@ -143,7 +149,8 @@ namespace render { m_Sampler->m_MinFilter, m_Sampler->m_MagFilter, m_Sampler->m_WrapS, m_Sampler->m_WrapT, m_Sampler->m_WrapR, m_Sampler->m_MinLod, m_Sampler->m_MaxLod, m_Sampler->m_LodBias, - m_Sampler->m_CompareMode, m_Sampler->m_CompareOp); + m_Sampler->m_CompareMode, m_Sampler->m_CompareOp, + getMaxAnisotropy()); m_SamplerParamsDirty = false; } diff --git a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGL3.cpp b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGL3.cpp index d78c51d9..f49f3a16 100644 --- a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGL3.cpp +++ b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGL3.cpp @@ -300,7 +300,8 @@ namespace render { m_Conversion.fromTextureCompareFuncToGL(compareFunc))); if (m_backendSupport.caps.bits.bAnistropySupported) { - GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy)); + GL_CALL_EXTRA_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, + qMin(anisotropy, m_maxAnisotropy))); } } diff --git a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.cpp b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.cpp index 940ab094..ba25ae7e 100644 --- a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.cpp +++ b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.cpp @@ -81,6 +81,8 @@ namespace render { QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendRasterizerStateGL)(); m_pCurrentDepthStencilState = QT3DS_NEW(m_Foundation.getAllocator(), NVRenderBackendDepthStencilStateGL)(); + + m_glFunctions->glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_maxAnisotropy); } /// destructor NVRenderBackendGLBase::~NVRenderBackendGLBase() @@ -1167,7 +1169,8 @@ namespace render { GL_CALL_FUNCTION(glTexParameteri(glTarget, GL_TEXTURE_WRAP_T, m_Conversion.fromTextureCoordOpToGL(wrapT))); if (m_backendSupport.caps.bits.bAnistropySupported) { - GL_CALL_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy)); + GL_CALL_FUNCTION(glTexParameterf(glTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, + qMin(m_maxAnisotropy, anisotropy))); } } diff --git a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.h b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.h index 9048a9c4..28e4dbb1 100644 --- a/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.h +++ b/src/Runtime/Source/render/backends/gl/Qt3DSRenderBackendGLBase.h @@ -523,6 +523,7 @@ namespace render { #endif QOpenGLFunctions *m_glFunctions; QOpenGLExtraFunctions *m_glExtraFunctions; + GLfloat m_maxAnisotropy; }; } } diff --git a/src/Runtime/Source/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp b/src/Runtime/Source/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp index 74e55d79..638e8458 100644 --- a/src/Runtime/Source/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp +++ b/src/Runtime/Source/runtimerender/resourcemanager/Qt3DSRenderBufferManager.cpp @@ -446,6 +446,14 @@ struct SBufferManager : public IBufferManager theTexture->SetTextureData( NVDataRef<QT3DSU8>((QT3DSU8 *)inLoadedImage.data, inLoadedImage.dataSizeInBytes), 0, inLoadedImage.width, inLoadedImage.height, inLoadedImage.format, destFormat); + { + static int enable = qEnvironmentVariableIntValue("QT3DS_GENERATE_MIPMAPS"); + if (enable) { + theTexture->SetMinFilter(NVRenderTextureMinifyingOp::LinearMipmapLinear); + theTexture->SetMagFilter(NVRenderTextureMagnifyingOp::Linear); + theTexture->GenerateMipmaps(); + } + } } if (inBsdfMipmaps |