From ecef6de99cfa7fc9eb311f78c885e78f1caccbdf Mon Sep 17 00:00:00 2001 From: Jerry Gamache Date: Thu, 9 Sep 2021 12:19:40 -0400 Subject: [PATCH] Properly use fallback color in vp2RenderDelegate - Handle out of texture border color - Handle missing texture --- .../render/vp2RenderDelegate/material.cpp | 52 +++- .../render/vp2RenderDelegate/material.h | 2 +- .../baseline/TestFallbackColor.png | Bin 0 -> 32670 bytes .../testVP2RenderDelegateUSDPreviewSurface.py | 12 + .../UsdPreviewSurface/TestFallbackColor.usda | 222 ++++++++++++++++++ 5 files changed, 281 insertions(+), 7 deletions(-) create mode 100644 test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateUSDPreviewSurface/baseline/TestFallbackColor.png create mode 100644 test/testSamples/UsdPreviewSurface/TestFallbackColor.usda diff --git a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp index ccaeea1a4d..77c225e255 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/material.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/material.cpp @@ -116,6 +116,7 @@ TF_DEFINE_PRIVATE_TOKENS( (sRGB) (raw) (glslfx) + (fallback) (input) (output) @@ -681,6 +682,16 @@ MHWRender::MSamplerStateDesc _GetSamplerStateDesc(const HdMaterialNode& node) #endif } + it = node.parameters.find(_tokens->fallback); + if (it != node.parameters.end()) { + const VtValue& value = it->second; + if (value.IsHolding()) { + const GfVec4f& fallbackValue = value.UncheckedGet(); + float const* value = fallbackValue.data(); + std::copy(value, value + 4, desc.borderColor); + } + } + return desc; } @@ -815,8 +826,11 @@ _LoadUdimTexture(const std::string& path, bool& isColorSpaceSRGB, MFloatArray& u } //! Load texture from the specified path -MHWRender::MTexture* -_LoadTexture(const std::string& path, bool& isColorSpaceSRGB, MFloatArray& uvScaleOffset) +MHWRender::MTexture* _LoadTexture( + const std::string& path, + bool& isColorSpaceSRGB, + MFloatArray& uvScaleOffset, + const HdMaterialNode& node) { MProfilingScope profilingScope( HdVP2RenderDelegate::sProfilerCategory, MProfiler::kColorD_L2, "LoadTexture", path.c_str()); @@ -844,7 +858,32 @@ _LoadTexture(const std::string& path, bool& isColorSpaceSRGB, MFloatArray& uvSca #endif if (!TF_VERIFY(image, "Unable to create an image from %s", path.c_str())) { - return nullptr; + // Create a 1x1 texture of the fallback color, if it was specified: + auto it = node.parameters.find(_tokens->fallback); + if (it == node.parameters.end()) { + return nullptr; + } + const VtValue& value = it->second; + if (!value.IsHolding()) { + return nullptr; + } + + MHWRender::MTextureDescription desc; + desc.setToDefault2DTexture(); + desc.fWidth = 1; + desc.fHeight = 1; + desc.fFormat = MHWRender::kR8G8B8A8_UNORM; + desc.fBytesPerRow = 4; + desc.fBytesPerSlice = desc.fBytesPerRow; + + const GfVec4f& fallbackValue = value.UncheckedGet(); + std::vector texels(4); + for (size_t i = 0; i < 4; ++i) { + float texelValue = std::max(std::min(fallbackValue[i], 1.0f), 0.0f); + texels[i] = static_cast(texelValue * 255.0); + } + isColorSpaceSRGB = false; + return textureMgr->acquireTexture(path.c_str(), desc, texels.data()); } // This image is used for loading pixel data from usdz only and should @@ -2168,7 +2207,7 @@ void HdVP2Material::_UpdateShaderInstance(const HdMaterialNetwork& mat) const std::string& assetPath = val.GetAssetPath(); if (_IsUsdUVTexture(node) && token == _tokens->file) { const HdVP2TextureInfo& info - = _AcquireTexture(!resolvedPath.empty() ? resolvedPath : assetPath); + = _AcquireTexture(!resolvedPath.empty() ? resolvedPath : assetPath, node); MHWRender::MTextureAssignment assignment; assignment.texture = info._texture.get(); @@ -2262,7 +2301,8 @@ void HdVP2Material::_UpdateShaderInstance(const HdMaterialNetwork& mat) /*! \brief Acquires a texture for the given image path. */ -const HdVP2TextureInfo& HdVP2Material::_AcquireTexture(const std::string& path) +const HdVP2TextureInfo& +HdVP2Material::_AcquireTexture(const std::string& path, const HdMaterialNode& node) { const auto it = _textureMap.find(path); if (it != _textureMap.end()) { @@ -2271,7 +2311,7 @@ const HdVP2TextureInfo& HdVP2Material::_AcquireTexture(const std::string& path) bool isSRGB = false; MFloatArray uvScaleOffset; - MHWRender::MTexture* texture = _LoadTexture(path, isSRGB, uvScaleOffset); + MHWRender::MTexture* texture = _LoadTexture(path, isSRGB, uvScaleOffset, node); HdVP2TextureInfo& info = _textureMap[path]; info._texture.reset(texture); diff --git a/lib/mayaUsd/render/vp2RenderDelegate/material.h b/lib/mayaUsd/render/vp2RenderDelegate/material.h index 103234c28b..dd98f4a1a8 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/material.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/material.h @@ -110,7 +110,7 @@ class HdVP2Material final : public HdMaterial #endif MHWRender::MShaderInstance* _CreateShaderInstance(const HdMaterialNetwork& mat); void _UpdateShaderInstance(const HdMaterialNetwork& mat); - const HdVP2TextureInfo& _AcquireTexture(const std::string& path); + const HdVP2TextureInfo& _AcquireTexture(const std::string& path, const HdMaterialNode& node); #ifdef HDVP2_MATERIAL_CONSOLIDATION_UPDATE_WORKAROUND //! Trigger sync on all Rprims which are listening to changes on this material. diff --git a/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateUSDPreviewSurface/baseline/TestFallbackColor.png b/test/lib/mayaUsd/render/vp2RenderDelegate/VP2RenderDelegateUSDPreviewSurface/baseline/TestFallbackColor.png new file mode 100644 index 0000000000000000000000000000000000000000..936048987bba06463f71db5676b41fd595c0b680 GIT binary patch literal 32670 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 + point3f[] points = [(-0.5, 0, 0.5), (0.5, 0, 0.5), (-0.5, 0, -0.5), (0.5, 0, -0.5)] + texCoord2f[] primvars:st = [(0, 0), (1, 0), (0, 1), (1, 1)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 2] + float3 xformOp:rotateXYZ = (90, 0, 0) + double3 xformOp:translate = (-1.5, 0, 0) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + + def Scope "Looks" + { + def Material "usdPreviewSurface1SG" + { + token inputs:file1:varname = "st" + token outputs:surface.connect = + + def Shader "usdPreviewSurface1" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = + token outputs:displacement + token outputs:surface + } + + def Shader "file1" + { + uniform token info:id = "UsdUVTexture" + float4 inputs:fallback = (0, 1, 0, 1) + asset inputs:file = @grid.png@ + token inputs:sourceColorSpace = "sRGB" + float2 inputs:st.connect = + token inputs:wrapS = "black" + token inputs:wrapT = "black" + float3 outputs:rgb + + def Shader "TexCoordReader" + { + uniform token info:id = "UsdPrimvarReader_float2" + token inputs:varname.connect = + float2 outputs:result + } + + def Shader "UsdTransform2d" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = + float inputs:rotation = 45 + float2 inputs:scale = (1, 1) + float2 inputs:translation = (0.49999997, -0.20710683) + float2 outputs:result + } + } + } + } +} + +def Mesh "pPlane2" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, 0, -0.5), (0.5, 0, 0.5)] + int[] faceVertexCounts = [4] + int[] faceVertexIndices = [0, 1, 3, 2] + rel material:binding = + point3f[] points = [(-0.5, 0, 0.5), (0.5, 0, 0.5), (-0.5, 0, -0.5), (0.5, 0, -0.5)] + texCoord2f[] primvars:st = [(0, 0), (1, 0), (0, 1), (1, 1)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 2] + float3 xformOp:rotateXYZ = (90, 0, 0) + uniform token[] xformOpOrder = ["xformOp:rotateXYZ"] + + def Scope "Looks" + { + def Material "usdPreviewSurface3SG" + { + token inputs:file3:varname = "st" + token outputs:surface.connect = + + def Shader "usdPreviewSurface3" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = + token outputs:displacement + token outputs:surface + } + + def Shader "file3" + { + uniform token info:id = "UsdUVTexture" + float4 inputs:fallback = (1, 1, 0, 1) + asset inputs:file = @does_not_exist.png@ + token inputs:sourceColorSpace = "sRGB" + float2 inputs:st.connect = + token inputs:wrapS = "black" + token inputs:wrapT = "black" + float3 outputs:rgb + + def Shader "TexCoordReader" + { + uniform token info:id = "UsdPrimvarReader_float2" + token inputs:varname.connect = + float2 outputs:result + } + + def Shader "UsdTransform2d" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = + float inputs:rotation = 45 + float2 inputs:scale = (1, 1) + float2 inputs:translation = (0.49999997, -0.20710683) + float2 outputs:result + } + } + } + } +} + +def Mesh "pPlane3" ( + prepend apiSchemas = ["MaterialBindingAPI"] + kind = "component" +) +{ + uniform bool doubleSided = 1 + float3[] extent = [(-0.5, 0, -0.5), (0.5, 0, 0.5)] + int[] faceVertexCounts = [4] + int[] faceVertexIndices = [0, 1, 3, 2] + rel material:binding = + point3f[] points = [(-0.5, 0, 0.5), (0.5, 0, 0.5), (-0.5, 0, -0.5), (0.5, 0, -0.5)] + texCoord2f[] primvars:st = [(0, 0), (1, 0), (0, 1), (1, 1)] ( + customData = { + dictionary Maya = { + token name = "map1" + } + } + interpolation = "faceVarying" + ) + int[] primvars:st:indices = [0, 1, 3, 2] + float3 xformOp:rotateXYZ = (90, 0, 0) + double3 xformOp:translate = (1.5, 0, 0) + uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:rotateXYZ"] + + def Scope "Looks" + { + def Material "usdPreviewSurface4SG" + { + token inputs:file4:varname = "st" + token outputs:surface.connect = + + def Shader "usdPreviewSurface4" + { + uniform token info:id = "UsdPreviewSurface" + color3f inputs:diffuseColor.connect = + token outputs:displacement + token outputs:surface + } + + def Shader "file4" + { + uniform token info:id = "UsdUVTexture" + asset inputs:file = @neither_does_this_one.png@ + token inputs:sourceColorSpace = "sRGB" + float2 inputs:st.connect = + token inputs:wrapS = "black" + token inputs:wrapT = "black" + float3 outputs:rgb + + def Shader "TexCoordReader" + { + uniform token info:id = "UsdPrimvarReader_float2" + token inputs:varname.connect = + float2 outputs:result + } + + def Shader "UsdTransform2d" + { + uniform token info:id = "UsdTransform2d" + float2 inputs:in.connect = + float inputs:rotation = 45 + float2 inputs:scale = (1, 1) + float2 inputs:translation = (0.49999997, -0.20710683) + float2 outputs:result + } + } + } + } +} +