#ifndef INPUT_LUXLWRP_BASE_INCLUDED #define INPUT_LUXLWRP_BASE_INCLUDED #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" // defines a bunch of helper functions (like lerpwhiteto) #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/CommonMaterial.hlsl" // defines SurfaceData, textures and the functions Alpha, SampleAlbedoAlpha, SampleNormal, SampleEmission #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl" // defines e.g. "DECLARE_LIGHTMAP_OR_SH" #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl" #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" // Material Inputs CBUFFER_START(UnityPerMaterial) half4 _BaseColor; half _Cutoff; float4 _BaseMap_ST; half _Smoothness; half4 _SpecColor; half _BumpScale; half4 _RimColor; half _RimPower; half _RimMinPower; half _RimFrequency; half _RimPerPositionFrequency; CBUFFER_END // Additional textures #if defined(_MASKMAP) TEXTURE2D(_MaskMap); SAMPLER(sampler_MaskMap); #endif // Global Inputs // Structs struct VertexInput { float3 positionOS : POSITION; float3 normalOS : NORMAL; float4 tangentOS : TANGENT; float2 texcoord : TEXCOORD0; float2 lightmapUV : TEXCOORD1; half4 color : COLOR; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct VertexOutput { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; #if defined(DEPTHNORMALONLYPASS) float3 normalWS : TEXCOORD4; #endif #if !defined(UNITY_PASS_SHADOWCASTER) && !defined(DEPTHONLYPASS) DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 1); float3 positionWS : TEXCOORD2; float3 viewDirWS : TEXCOORD3; #if defined(_NORMALMAP) //float3 normalWS : TEXCOORD4; float4 tangentWS : TEXCOORD5; #endif half4 fogFactorAndVertexLight : TEXCOORD6; #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) float4 shadowCoord : TEXCOORD7; #endif #endif UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO }; struct SurfaceDescription { half3 albedo; half alpha; half3 normalTS; half3 emission; half metallic; half3 specular; half smoothness; half occlusion; }; // flat PBR lighting half4 LuxURPFlatFragmentPBR(InputData inputData, half3 albedo, half metallic, half3 specular, half smoothness, half occlusion, half3 emission, half alpha) { #ifdef _SPECULARHIGHLIGHTS_OFF bool specularHighlightsOff = true; #else bool specularHighlightsOff = false; #endif BRDFData brdfData; // NOTE: can modify alpha InitializeBRDFData(albedo, metallic, specular, smoothness, alpha, brdfData); BRDFData brdfDataClearCoat = (BRDFData)0; #if defined(_CLEARCOAT) || defined(_CLEARCOATMAP) // base brdfData is modified here, rely on the compiler to eliminate dead computation by InitializeBRDFData() // InitializeBRDFDataClearCoat(surfaceData.clearCoatMask, surfaceData.clearCoatSmoothness, brdfData, brdfDataClearCoat); #endif // To ensure backward compatibility we have to avoid using shadowMask input, as it is not present in older shaders #if defined(SHADOWS_SHADOWMASK) && defined(LIGHTMAP_ON) half4 shadowMask = inputData.shadowMask; #elif !defined (LIGHTMAP_ON) half4 shadowMask = unity_ProbesOcclusion; #else half4 shadowMask = half4(1, 1, 1, 1); #endif Light mainLight = GetMainLight(inputData.shadowCoord, inputData.positionWS, shadowMask); #if defined(_SCREEN_SPACE_OCCLUSION) && defined(_SSAO_ENABLED) AmbientOcclusionFactor aoFactor = GetScreenSpaceAmbientOcclusion(inputData.normalizedScreenSpaceUV); mainLight.color *= aoFactor.directAmbientOcclusion; occlusion = min(occlusion, aoFactor.indirectAmbientOcclusion); #endif MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI); half3 color = GlobalIllumination(brdfData, brdfDataClearCoat, 0, inputData.bakedGI, occlusion, inputData.normalWS, inputData.viewDirectionWS); color += LightingPhysicallyBased(brdfData, brdfDataClearCoat, mainLight, inputData.normalWS, inputData.viewDirectionWS, 0, specularHighlightsOff); #ifdef _ADDITIONAL_LIGHTS uint pixelLightCount = GetAdditionalLightsCount(); for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex) { Light light = GetAdditionalLight(lightIndex, inputData.positionWS, shadowMask); #if defined(_SCREEN_SPACE_OCCLUSION) && defined(_SSAO_ENABLED) light.color *= aoFactor.directAmbientOcclusion; #endif color += LightingPhysicallyBased(brdfData, brdfDataClearCoat, light, inputData.normalWS, inputData.viewDirectionWS, 0, specularHighlightsOff); } #endif #ifdef _ADDITIONAL_LIGHTS_VERTEX color += inputData.vertexLighting * brdfData.diffuse; #endif color += emission; return half4(color, alpha); } #endif