From 998df9013ad75532be9e32608d497be1d0a34285 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 7 Apr 2026 00:38:00 +0800 Subject: [PATCH] rendering: migrate object id shader to unity-style single source --- .../shaders/object-id/object-id.shader | 42 +++++++++++++++---- .../unit/test_builtin_forward_pipeline.cpp | 21 ++++------ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/engine/assets/builtin/shaders/object-id/object-id.shader b/engine/assets/builtin/shaders/object-id/object-id.shader index d84c5752..67241e9f 100644 --- a/engine/assets/builtin/shaders/object-id/object-id.shader +++ b/engine/assets/builtin/shaders/object-id/object-id.shader @@ -6,16 +6,44 @@ Shader "Builtin Object Id" { Name "ObjectId" Tags { "LightMode" = "ObjectId" } - Resources - { - PerObjectConstants (ConstantBuffer, 0, 0) [Semantic(PerObject)] - } + Cull Back + ZWrite On + ZTest LEqual HLSLPROGRAM + #pragma target 4.5 #pragma vertex MainVS #pragma fragment MainPS - #pragma backend D3D12 HLSL "object-id.vs.hlsl" "object-id.ps.hlsl" vs_5_0 ps_5_0 - #pragma backend OpenGL GLSL "object-id.vert.glsl" "object-id.frag.glsl" - #pragma backend Vulkan GLSL "object-id.vert.vk.glsl" "object-id.frag.vk.glsl" + cbuffer PerObjectConstants : register(b0) + { + float4x4 gProjectionMatrix; + float4x4 gViewMatrix; + float4x4 gModelMatrix; + float4 gObjectIdColor; + }; + + struct VSInput + { + float3 position : POSITION; + }; + + struct PSInput + { + float4 position : SV_POSITION; + }; + + PSInput MainVS(VSInput input) + { + PSInput output; + const float4 positionWS = mul(gModelMatrix, float4(input.position, 1.0)); + const float4 positionVS = mul(gViewMatrix, positionWS); + output.position = mul(gProjectionMatrix, positionVS); + return output; + } + + float4 MainPS(PSInput input) : SV_TARGET + { + return gObjectIdColor; + } ENDHLSL } } diff --git a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp index 232ad960..7214937e 100644 --- a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp +++ b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp @@ -502,7 +502,7 @@ TEST(BuiltinDepthStylePass_Test, BuiltinShadowCasterShaderDeclaresExplicitPerObj delete shader; } -TEST(BuiltinObjectIdPass_Test, BuiltinObjectIdShaderDeclaresExplicitPerObjectResourceContract) { +TEST(BuiltinObjectIdPass_Test, BuiltinObjectIdShaderUsesUnityStyleSingleSourceContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinObjectIdShaderPath()); ASSERT_TRUE(result); @@ -513,17 +513,16 @@ TEST(BuiltinObjectIdPass_Test, BuiltinObjectIdShaderDeclaresExplicitPerObjectRes const ShaderPass* pass = shader->FindPass("ObjectId"); ASSERT_NE(pass, nullptr); - ASSERT_EQ(pass->resources.Size(), 1u); - - EXPECT_EQ(pass->resources[0].semantic, "PerObject"); - EXPECT_EQ(pass->resources[0].type, ShaderResourceType::ConstantBuffer); - EXPECT_EQ(pass->resources[0].set, 0u); - EXPECT_EQ(pass->resources[0].binding, 0u); + EXPECT_TRUE(pass->resources.Empty()); + EXPECT_TRUE(pass->hasFixedFunctionState); + EXPECT_EQ(pass->fixedFunctionState.cullMode, MaterialCullMode::Back); + EXPECT_TRUE(pass->fixedFunctionState.depthWriteEnable); + EXPECT_EQ(pass->fixedFunctionState.depthFunc, MaterialComparisonFunc::LessEqual); delete shader; } -TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromExplicitObjectIdResources) { +TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromBuiltinObjectIdShaderContract) { ShaderLoader loader; LoadResult result = loader.Load(GetBuiltinObjectIdShaderPath()); ASSERT_TRUE(result); @@ -534,11 +533,10 @@ TEST(BuiltinObjectIdPass_Test, BuildsBuiltinPassResourceBindingPlanFromExplicitO const ShaderPass* pass = shader->FindPass("ObjectId"); ASSERT_NE(pass, nullptr); - ASSERT_EQ(pass->resources.Size(), 1u); BuiltinPassResourceBindingPlan plan = {}; String error; - EXPECT_TRUE(TryBuildBuiltinPassResourceBindingPlan(pass->resources, plan, &error)) << error.CStr(); + EXPECT_TRUE(TryBuildBuiltinPassResourceBindingPlan(*pass, plan, &error)) << error.CStr(); ASSERT_EQ(plan.bindings.Size(), 1u); EXPECT_TRUE(plan.perObject.IsValid()); EXPECT_FALSE(plan.material.IsValid()); @@ -630,11 +628,10 @@ TEST(BuiltinPassLayout_Test, BuildsSharedSetLayoutsFromExplicitObjectIdResources const ShaderPass* pass = shader->FindPass("ObjectId"); ASSERT_NE(pass, nullptr); - ASSERT_EQ(pass->resources.Size(), 1u); BuiltinPassResourceBindingPlan plan = {}; String error; - ASSERT_TRUE(TryBuildBuiltinPassResourceBindingPlan(pass->resources, plan, &error)) << error.CStr(); + ASSERT_TRUE(TryBuildBuiltinPassResourceBindingPlan(*pass, plan, &error)) << error.CStr(); std::vector setLayouts; ASSERT_TRUE(TryBuildBuiltinPassSetLayouts(plan, setLayouts, &error)) << error.CStr();