From 8300229adaa5449052a47a4c2237833477799803 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Thu, 23 Mar 2023 16:31:45 +0900 Subject: [PATCH] Make equirectangular environment also use mipmap + Fix brdf error Change-Id: Iaa303a31c4223197b295a6f722dee3c0ebaa6216 Signed-off-by: Eunki, Hong --- .../graphics/shaders/default-physically-based-shader.frag | 2 +- dali-scene3d/public-api/loader/environment-map-data.cpp | 14 +++++++------- dali-scene3d/public-api/loader/environment-map-loader.cpp | 14 ++++++++++++-- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/dali-scene3d/internal/graphics/shaders/default-physically-based-shader.frag b/dali-scene3d/internal/graphics/shaders/default-physically-based-shader.frag index edfb1d8..022e21b 100644 --- a/dali-scene3d/internal/graphics/shaders/default-physically-based-shader.frag +++ b/dali-scene3d/internal/graphics/shaders/default-physically-based-shader.frag @@ -189,7 +189,7 @@ void main() mediump vec3 v = normalize(vPositionToCamera); // Vector from surface point to camera mediump float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0); mediump vec3 reflection = -normalize(reflect(v, n)); - lowp vec3 brdf = linear(texture(sbrdfLUT, vec2(NdotV, 1.0 - perceptualRoughness)).rgb); + lowp vec3 brdf = texture(sbrdfLUT, vec2(NdotV, 1.0 - perceptualRoughness)).rgb; vec3 Fr = max(vec3(1.0 - perceptualRoughness), f0) - f0; vec3 k_S = f0 + Fr * pow(1.0 - NdotV, 5.0); vec3 FssEss = specularWeight * (k_S * brdf.x + brdf.y); diff --git a/dali-scene3d/public-api/loader/environment-map-data.cpp b/dali-scene3d/public-api/loader/environment-map-data.cpp index cca2952..7766487 100644 --- a/dali-scene3d/public-api/loader/environment-map-data.cpp +++ b/dali-scene3d/public-api/loader/environment-map-data.cpp @@ -46,19 +46,19 @@ Texture EnvironmentMapData::GetTexture() mEnvironmentMapTexture.Upload(side[iMipLevel], CubeMapLayer::POSITIVE_X + iSide, iMipLevel, 0u, 0u, side[iMipLevel].GetWidth(), side[iMipLevel].GetHeight()); } } - - // If mipmap is not defined explicitly, use GenerateMipmaps. - // TODO: Maybe we can use better way to know it already has mipmap or not. - if(mPixelData.size() > 0u && mPixelData[0].size() == 1u) - { - mEnvironmentMapTexture.GenerateMipmaps(); - } } else { mEnvironmentMapTexture = Texture::New(TextureType::TEXTURE_2D, mPixelData[0][0].GetPixelFormat(), mPixelData[0][0].GetWidth(), mPixelData[0][0].GetHeight()); mEnvironmentMapTexture.Upload(mPixelData[0][0], 0, 0, 0, 0, mPixelData[0][0].GetWidth(), mPixelData[0][0].GetHeight()); } + + // If mipmap is not defined explicitly, use GenerateMipmaps. + // TODO: Maybe we can use better way to know it already has mipmap or not. + if(mPixelData.size() > 0u && mPixelData[0].size() == 1u) + { + mEnvironmentMapTexture.GenerateMipmaps(); + } } return mEnvironmentMapTexture; } diff --git a/dali-scene3d/public-api/loader/environment-map-loader.cpp b/dali-scene3d/public-api/loader/environment-map-loader.cpp index 306d3b2..bbfe829 100644 --- a/dali-scene3d/public-api/loader/environment-map-loader.cpp +++ b/dali-scene3d/public-api/loader/environment-map-loader.cpp @@ -169,8 +169,6 @@ bool LoadEnvironmentMapData(const std::string& environmentMapUrl, Scene3D::Loade { environmentMapData.mPixelData[i][0] = GetCubeFace(pixelBuffer, i, cubeType, faceWidth, faceHeight); } - uint32_t mipmap = static_cast(1 + std::floor(std::log2(std::max(environmentMapData.mPixelData[0][0].GetWidth(), environmentMapData.mPixelData[0][0].GetHeight())))); - environmentMapData.SetMipmapLevels(mipmap); environmentMapData.SetEnvironmentMapType(Scene3D::EnvironmentMapType::CUBEMAP); } else @@ -180,6 +178,18 @@ bool LoadEnvironmentMapData(const std::string& environmentMapUrl, Scene3D::Loade environmentMapData.mPixelData[0][0] = Devel::PixelBuffer::Convert(pixelBuffer); environmentMapData.SetEnvironmentMapType(Scene3D::EnvironmentMapType::EQUIRECTANGULAR); } + + if(!environmentMapData.mPixelData.empty() && !environmentMapData.mPixelData[0].empty() && environmentMapData.mPixelData[0][0]) + { + const uint32_t pixelDataWidth = environmentMapData.mPixelData[0][0].GetWidth(); + const uint32_t pixelDataHeight = environmentMapData.mPixelData[0][0].GetHeight(); + + if(pixelDataWidth > 0u && pixelDataHeight > 0u) + { + uint32_t mipmap = static_cast(1 + std::floor(std::log2(std::min(pixelDataWidth, pixelDataHeight)))); + environmentMapData.SetMipmapLevels(mipmap); + } + } return true; } return false; -- 2.7.4