From 3696501050f48f5637cd5c86706fcaeaeb402f4e Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 29 Mar 2024 18:07:10 +0100 Subject: [PATCH] Fix invalid shader codegen when using `ddx`/`ddy` in material vertex shader #2376 --- .../MaterialGenerator.Material.cpp | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp index 508417895..66d24d4f3 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp @@ -421,15 +421,31 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) // DDX case 30: { - const auto inValue = tryGetValue(node->GetBox(0), 0, Value::Zero); - value = writeLocal(inValue.Type, String::Format(TEXT("ddx({0})"), inValue.Value), node); + if (_treeType == MaterialTreeType::PixelShader) + { + const auto inValue = tryGetValue(node->GetBox(0), 0, Value::Zero); + value = writeLocal(inValue.Type, String::Format(TEXT("ddx({0})"), inValue.Value), node); + } + else + { + // No derivatives support in VS/DS + value = Value::Zero; + } break; } // DDY case 31: { - const auto inValue = tryGetValue(node->GetBox(0), 0, Value::Zero); - value = writeLocal(inValue.Type, String::Format(TEXT("ddy({0})"), inValue.Value), node); + if (_treeType == MaterialTreeType::PixelShader) + { + const auto inValue = tryGetValue(node->GetBox(0), 0, Value::Zero); + value = writeLocal(inValue.Type, String::Format(TEXT("ddy({0})"), inValue.Value), node); + } + else + { + // No derivatives support in VS/DS + value = Value::Zero; + } break; } // Sign