@@ -303,7 +303,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
303
303
304
304
//! Processes the set of Standard material inputs for a single layer.
305
305
//! The FILL_STANDARD_MATERIAL_INPUTS() macro below can be used to fill the StandardMaterialInputs struct.
306
- ProcessedMaterialInputs ProcessStandardMaterialInputs(StandardMaterialInputs inputs)
306
+ ProcessedMaterialInputs ProcessStandardMaterialInputs(StandardMaterialInputs inputs, float4 uvDxDy = float4(0.0f, 0.0f, 0.0f, 0.0f), bool customDerivatives = false )
307
307
{
308
308
ProcessedMaterialInputs result;
309
309
@@ -312,17 +312,17 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
312
312
transformedUv[1] = inputs.m_vertexUv[1];
313
313
314
314
real3x3 normalUvMatrix = inputs.m_normalMapUvIndex == 0 ? real3x3(inputs.m_uvMatrix) : real3x3(CreateIdentity3x3());
315
- result.m_normalTS = GetNormalInputTS(inputs.m_normalMap, inputs.m_sampler, transformedUv[inputs.m_normalMapUvIndex], inputs.m_flipNormalX, inputs.m_flipNormalY, normalUvMatrix, inputs.m_normal_useTexture, real(inputs.m_normalFactor));
315
+ result.m_normalTS = GetNormalInputTS(inputs.m_normalMap, inputs.m_sampler, transformedUv[inputs.m_normalMapUvIndex], inputs.m_flipNormalX, inputs.m_flipNormalY, normalUvMatrix, inputs.m_normal_useTexture, real(inputs.m_normalFactor), uvDxDy, customDerivatives );
316
316
317
- real3 sampledBaseColor = GetBaseColorInput(inputs.m_baseColorMap, inputs.m_sampler, transformedUv[inputs.m_baseColorMapUvIndex], real3(inputs.m_baseColor.rgb), inputs.m_baseColor_useTexture);
317
+ real3 sampledBaseColor = GetBaseColorInput(inputs.m_baseColorMap, inputs.m_sampler, transformedUv[inputs.m_baseColorMapUvIndex], real3(inputs.m_baseColor.rgb), inputs.m_baseColor_useTexture, uvDxDy, customDerivatives );
318
318
result.m_baseColor = BlendBaseColor(sampledBaseColor, real3(inputs.m_baseColor.rgb), real(inputs.m_baseColorFactor), inputs.m_baseColorTextureBlendMode, inputs.m_baseColor_useTexture);
319
- result.m_specularF0Factor = GetSpecularInput(inputs.m_specularF0Map, inputs.m_sampler, transformedUv[inputs.m_specularF0MapUvIndex], real(inputs.m_specularF0Factor), inputs.m_specularF0_useTexture);
320
- result.m_metallic = GetMetallicInput(inputs.m_metallicMap, inputs.m_sampler, transformedUv[inputs.m_metallicMapUvIndex], real(inputs.m_metallicFactor), inputs.m_metallic_useTexture);
321
- result.m_roughness = GetRoughnessInput(inputs.m_roughnessMap, MaterialSrg::m_sampler, transformedUv[inputs.m_roughnessMapUvIndex], real(inputs.m_roughnessFactor), real(inputs.m_roughnessLowerBound), real(inputs.m_roughnessUpperBound), inputs.m_roughness_useTexture);
319
+ result.m_specularF0Factor = GetSpecularInput(inputs.m_specularF0Map, inputs.m_sampler, transformedUv[inputs.m_specularF0MapUvIndex], real(inputs.m_specularF0Factor), inputs.m_specularF0_useTexture, uvDxDy, customDerivatives );
320
+ result.m_metallic = GetMetallicInput(inputs.m_metallicMap, inputs.m_sampler, transformedUv[inputs.m_metallicMapUvIndex], real(inputs.m_metallicFactor), inputs.m_metallic_useTexture, uvDxDy, customDerivatives );
321
+ result.m_roughness = GetRoughnessInput(inputs.m_roughnessMap, MaterialSrg::m_sampler, transformedUv[inputs.m_roughnessMapUvIndex], real(inputs.m_roughnessFactor), real(inputs.m_roughnessLowerBound), real(inputs.m_roughnessUpperBound), inputs.m_roughness_useTexture, uvDxDy, customDerivatives );
322
322
323
- result.m_emissiveLighting = GetEmissiveInput(inputs.m_emissiveMap, inputs.m_sampler, transformedUv[inputs.m_emissiveMapUvIndex], real(inputs.m_emissiveIntensity), real3(inputs.m_emissiveColor.rgb), 0.0, 1.0, inputs.m_emissiveEnabled, inputs.m_emissive_useTexture);
324
- result.m_diffuseAmbientOcclusion = GetOcclusionInput(inputs.m_diffuseOcclusionMap, inputs.m_sampler, transformedUv[inputs.m_diffuseOcclusionMapUvIndex], real(inputs.m_diffuseOcclusionFactor), inputs.m_diffuseOcclusion_useTexture);
325
- result.m_specularOcclusion = GetOcclusionInput(inputs.m_specularOcclusionMap, MaterialSrg::m_sampler, transformedUv[inputs.m_specularOcclusionMapUvIndex], real(inputs.m_specularOcclusionFactor), inputs.m_specularOcclusion_useTexture);
323
+ result.m_emissiveLighting = GetEmissiveInput(inputs.m_emissiveMap, inputs.m_sampler, transformedUv[inputs.m_emissiveMapUvIndex], real(inputs.m_emissiveIntensity), real3(inputs.m_emissiveColor.rgb), 0.0, 1.0, inputs.m_emissiveEnabled, inputs.m_emissive_useTexture, uvDxDy, customDerivatives );
324
+ result.m_diffuseAmbientOcclusion = GetOcclusionInput(inputs.m_diffuseOcclusionMap, inputs.m_sampler, transformedUv[inputs.m_diffuseOcclusionMapUvIndex], real(inputs.m_diffuseOcclusionFactor), inputs.m_diffuseOcclusion_useTexture, uvDxDy, customDerivatives );
325
+ result.m_specularOcclusion = GetOcclusionInput(inputs.m_specularOcclusionMap, MaterialSrg::m_sampler, transformedUv[inputs.m_specularOcclusionMapUvIndex], real(inputs.m_specularOcclusionFactor), inputs.m_specularOcclusion_useTexture, uvDxDy, customDerivatives );
326
326
327
327
#if ENABLE_CLEAR_COAT
328
328
result.m_clearCoat.InitializeToZero();
@@ -335,7 +335,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
335
335
inputs.m_clearCoatNormalMap, transformedUv[inputs.m_clearCoatNormalMapUvIndex], inputs.m_normal, inputs.m_clearCoat_normal_useTexture, real(inputs.m_clearCoatNormalStrength),
336
336
clearCoatUvMatrix, inputs.m_tangents[inputs.m_clearCoatNormalMapUvIndex], inputs.m_bitangents[inputs.m_clearCoatNormalMapUvIndex],
337
337
inputs.m_sampler, inputs.m_isFrontFace,
338
- result.m_clearCoat.factor, result.m_clearCoat.roughness, result.m_clearCoat.normal);
338
+ result.m_clearCoat.factor, result.m_clearCoat.roughness, result.m_clearCoat.normal, uvDxDy, customDerivatives );
339
339
}
340
340
#endif
341
341
@@ -427,15 +427,17 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
427
427
float2 uvs[UvSetCount],
428
428
bool isFrontFace,
429
429
bool isDisplacementClipped,
430
- float3 vertexBlendMask)
430
+ float3 vertexBlendMask,
431
+ float4 uvDxDy,
432
+ bool customDerivatives)
431
433
{
432
434
LayerBlendSource blendSource = GetFinalLayerBlendSource();
433
435
434
436
// ------- Debug Modes -------
435
437
436
438
if(o_debugDrawMode == DebugDrawMode::BlendMask)
437
439
{
438
- float3 blendMaskValues = GetApplicableBlendMaskValues(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask);
440
+ float3 blendMaskValues = GetApplicableBlendMaskValues(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask, uvDxDy, customDerivatives );
439
441
return MakeDebugSurface(positionWS, normalWS, real3(blendMaskValues));
440
442
}
441
443
@@ -450,14 +452,31 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
450
452
451
453
if(o_debugDrawMode == DebugDrawMode::FinalBlendWeights)
452
454
{
453
- float3 blendWeights = GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask);
455
+ float3 blendWeights;
456
+ if (customDerivatives)
457
+ {
458
+ blendWeights = GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask, uvDxDy, customDerivatives);
459
+ }
460
+ else
461
+ {
462
+ blendWeights = GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask, float4(0.0f, 0.0f, 0.0f, 0.0f), false);
463
+ }
454
464
return MakeDebugSurface(positionWS, normalWS, real3(blendWeights));
455
465
}
456
466
457
467
// ------- Calculate Layer Blend Mask Values -------
458
468
459
469
// Now that any parallax has been calculated, we calculate the blend factors for any layers that are impacted by the parallax.
460
- real3 blendWeights = (GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask));
470
+ real3 blendWeights;
471
+ if (customDerivatives)
472
+ {
473
+ blendWeights = real3(GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask, uvDxDy, customDerivatives));
474
+ }
475
+ else
476
+ {
477
+ blendWeights = real3(GetBlendWeights(blendSource, uvs[MaterialSrg::m_blendMaskUvIndex], vertexBlendMask, float4(0.0f, 0.0f, 0.0f, 0.0f), false));
478
+ }
479
+
461
480
462
481
// ------- Layer 1 (base layer) -----------
463
482
@@ -467,7 +486,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
467
486
StandardMaterialInputs inputs;
468
487
FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer1_, o_layer1_, blendWeights.r)
469
488
FILL_STANDARD_MATERIAL_INPUTS_CLEAR_COAT(inputs, MaterialSrg::m_layer1_, o_layer1_, blendWeights.r)
470
- lightingInputLayer1 = ProcessStandardMaterialInputs(inputs);
489
+ lightingInputLayer1 = ProcessStandardMaterialInputs(inputs, uvDxDy, customDerivatives );
471
490
}
472
491
else
473
492
{
@@ -483,7 +502,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
483
502
StandardMaterialInputs inputs;
484
503
FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer2_, o_layer2_, blendWeights.g)
485
504
FILL_STANDARD_MATERIAL_INPUTS_CLEAR_COAT(inputs, MaterialSrg::m_layer2_, o_layer2_, blendWeights.g)
486
- lightingInputLayer2 = ProcessStandardMaterialInputs(inputs);
505
+ lightingInputLayer2 = ProcessStandardMaterialInputs(inputs, uvDxDy, customDerivatives );
487
506
}
488
507
else
489
508
{
@@ -499,7 +518,7 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
499
518
StandardMaterialInputs inputs;
500
519
FILL_STANDARD_MATERIAL_INPUTS(inputs, MaterialSrg::m_layer3_, o_layer3_, blendWeights.b)
501
520
FILL_STANDARD_MATERIAL_INPUTS_CLEAR_COAT(inputs, MaterialSrg::m_layer3_, o_layer3_, blendWeights.b)
502
- lightingInputLayer3 = ProcessStandardMaterialInputs(inputs);
521
+ lightingInputLayer3 = ProcessStandardMaterialInputs(inputs, uvDxDy, customDerivatives );
503
522
}
504
523
else
505
524
{
@@ -572,6 +591,46 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
572
591
return surface;
573
592
}
574
593
594
+ // helper function to keep compatible with the previous version
595
+ // because dxc compiler doesn't allow default parameters on functions with overloads
596
+ Surface EvaluateSurface_StandardMultilayerPBR(
597
+ float3 positionWS,
598
+ real3 normalWS,
599
+ real3 tangents[UvSetCount],
600
+ real3 bitangents[UvSetCount],
601
+ float2 uvs[UvSetCount],
602
+ bool isFrontFace,
603
+ bool isDisplacementClipped,
604
+ float3 vertexBlendMask)
605
+ {
606
+ return EvaluateSurface_StandardMultilayerPBR(
607
+ positionWS,
608
+ normalWS,
609
+ tangents,
610
+ bitangents,
611
+ uvs,
612
+ isFrontFace,
613
+ isDisplacementClipped,
614
+ vertexBlendMask,
615
+ float4(0.0f, 0.0f, 0.0f, 0.0f),
616
+ false);
617
+ }
618
+
619
+ Surface EvaluateSurface_StandardMultilayerPBR(VsOutput IN, PixelGeometryData geoData, float4 uvDxDy, bool customDerivatives)
620
+ {
621
+ return EvaluateSurface_StandardMultilayerPBR(
622
+ geoData.positionWS,
623
+ geoData.vertexNormal,
624
+ geoData.tangents,
625
+ geoData.bitangents,
626
+ geoData.uvs,
627
+ geoData.isFrontFace,
628
+ geoData.isDisplacementClipped,
629
+ geoData.m_vertexBlendMask,
630
+ uvDxDy,
631
+ customDerivatives);
632
+ }
633
+
575
634
Surface EvaluateSurface_StandardMultilayerPBR(VsOutput IN, PixelGeometryData geoData)
576
635
{
577
636
return EvaluateSurface_StandardMultilayerPBR(
@@ -582,7 +641,9 @@ option enum class OpacityMode {Opaque, Cutout, Blended, TintedTransparent} o_opa
582
641
geoData.uvs,
583
642
geoData.isFrontFace,
584
643
geoData.isDisplacementClipped,
585
- geoData.m_vertexBlendMask);
644
+ geoData.m_vertexBlendMask,
645
+ float4(0.0f, 0.0f, 0.0f, 0.0f),
646
+ false);
586
647
}
587
648
588
649
#elif MATERIALPIPELINE_SHADER_HAS_GEOMETRIC_PIXEL_STAGE
0 commit comments