12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #ifndef UNIVERSAL_META_PASS_INCLUDED
- #define UNIVERSAL_META_PASS_INCLUDED
- #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
- #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
- CBUFFER_START(UnityMetaPass)
- // x = use uv1 as raster position
- // y = use uv2 as raster position
- bool4 unity_MetaVertexControl;
- // x = return albedo
- // y = return normal
- bool4 unity_MetaFragmentControl;
- CBUFFER_END
- float unity_OneOverOutputBoost;
- float unity_MaxOutputValue;
- float unity_UseLinearSpace;
- struct MetaInput
- {
- half3 Albedo;
- half3 Emission;
- half3 SpecularColor;
- };
- float4 MetaVertexPosition(float4 positionOS, float2 uv1, float2 uv2, float4 uv1ST, float4 uv2ST)
- {
- if (unity_MetaVertexControl.x)
- {
- positionOS.xy = uv1 * uv1ST.xy + uv1ST.zw;
- // OpenGL right now needs to actually use incoming vertex position,
- // so use it in a very dummy way
- positionOS.z = positionOS.z > 0 ? REAL_MIN : 0.0f;
- }
- if (unity_MetaVertexControl.y)
- {
- positionOS.xy = uv2 * uv2ST.xy + uv2ST.zw;
- // OpenGL right now needs to actually use incoming vertex position,
- // so use it in a very dummy way
- positionOS.z = positionOS.z > 0 ? REAL_MIN : 0.0f;
- }
- return TransformWorldToHClip(positionOS.xyz);
- }
- half4 MetaFragment(MetaInput input)
- {
- half4 res = 0;
- if (unity_MetaFragmentControl.x)
- {
- res = half4(input.Albedo, 1.0);
- // Apply Albedo Boost from LightmapSettings.
- res.rgb = clamp(PositivePow(res.rgb, saturate(unity_OneOverOutputBoost)), 0, unity_MaxOutputValue);
- }
- if (unity_MetaFragmentControl.y)
- {
- half3 emission;
- if (unity_UseLinearSpace)
- emission = input.Emission;
- else
- emission = LinearToSRGB(input.Emission);
- res = half4(emission, 1.0);
- }
- return res;
- }
- #endif
|