123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #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
|