struct RS2PS { float4 position : SV_POSITION; #ifdef HAS_TEXCOORD_0 float2 texcoord_0: TEXCOORD_0; #endif }; struct TextureInfo { uint textureIndex; uint samplerIndex; }; struct PBRMetallicRoughness { float4 baseColorFactor; TextureInfo baseColorTexture; float metallicFactor; float roughnessFactor; TextureInfo metallicRoughnessTexture; }; cbuffer Material : register(b2) { PBRMetallicRoughness pbrMetallicRoughness; }; Texture2D textures[5] : register(t0); SamplerState samplerState[5] : register(s0); float4 getBaseColor(float2 uv) { float4 baseColor = pbrMetallicRoughness.baseColorFactor; #ifdef HAS_TEXCOORD_0 TextureInfo baseColorTexture = pbrMetallicRoughness.baseColorTexture; if (baseColorTexture.textureIndex >= 0) { baseColor *= textures[baseColorTexture.textureIndex].Sample(samplerState[baseColorTexture.samplerIndex], uv); } #endif return baseColor; } float4 main(RS2PS input) : SV_Target { float2 uv = float2(0.0, 0.0); #ifdef HAS_TEXCOORD_0 uv = input.texcoord_0; #endif float4 color = getBaseColor(uv); return color; }