您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
146 行
3.3 KiB
146 行
3.3 KiB
Shader "Hidden/Internal-TiledReflections" {
|
|
Properties {
|
|
_LightTexture0 ("", any) = "" {}
|
|
_ShadowMapTexture ("", any) = "" {}
|
|
_SrcBlend ("", Float) = 1
|
|
_DstBlend ("", Float) = 1
|
|
}
|
|
SubShader {
|
|
|
|
|
|
|
|
|
|
Pass
|
|
{
|
|
ZWrite Off
|
|
ZTest Always
|
|
Cull Off
|
|
//Blend Off
|
|
Blend [_SrcBlend] [_DstBlend]
|
|
|
|
|
|
CGPROGRAM
|
|
#pragma target 4.5
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#pragma multi_compile USE_FPTL_LIGHTLIST USE_CLUSTERED_LIGHTLIST
|
|
#pragma multi_compile __ ENABLE_DEBUG
|
|
|
|
#include "UnityLightingCommon.cginc"
|
|
|
|
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind);
|
|
|
|
|
|
// uses the optimized single layered light list for opaques only
|
|
|
|
#ifdef USE_FPTL_LIGHTLIST
|
|
#define OPAQUES_ONLY
|
|
#endif
|
|
|
|
#include "TiledReflectionTemplate.hlsl"
|
|
|
|
|
|
UNITY_DECLARE_TEX2D_FLOAT(_CameraDepthTexture);
|
|
Texture2D _CameraGBufferTexture0;
|
|
Texture2D _CameraGBufferTexture1;
|
|
Texture2D _CameraGBufferTexture2;
|
|
|
|
|
|
float3 ExecuteReflectionProbes(uint2 pixCoord, uint start, uint numLights, float linDepth);
|
|
|
|
|
|
struct v2f {
|
|
float4 vertex : SV_POSITION;
|
|
float2 texcoord : TEXCOORD0;
|
|
};
|
|
|
|
v2f vert (float4 vertex : POSITION, float2 texcoord : TEXCOORD0)
|
|
{
|
|
v2f o;
|
|
o.vertex = UnityObjectToClipPos(vertex);
|
|
o.texcoord = texcoord.xy;
|
|
return o;
|
|
}
|
|
|
|
|
|
struct StandardData
|
|
{
|
|
float3 specularColor;
|
|
float3 diffuseColor;
|
|
float3 normalWorld;
|
|
float smoothness;
|
|
float occlusion;
|
|
};
|
|
|
|
struct LocalDataBRDF
|
|
{
|
|
StandardData gbuf;
|
|
|
|
// extras
|
|
float oneMinusReflectivity;
|
|
float3 Vworld;
|
|
};
|
|
|
|
static LocalDataBRDF g_localParams;
|
|
|
|
StandardData UnityStandardDataFromGbufferAux(float4 gbuffer0, float4 gbuffer1, float4 gbuffer2)
|
|
{
|
|
StandardData data;
|
|
|
|
data.normalWorld = normalize(2*gbuffer2.xyz-1);
|
|
data.smoothness = gbuffer1.a;
|
|
data.diffuseColor = gbuffer0.xyz; data.specularColor = gbuffer1.xyz;
|
|
data.occlusion = gbuffer0.a;
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind)
|
|
{
|
|
StandardData data = g_localParams.gbuf;
|
|
|
|
return data.occlusion * UNITY_BRDF_PBS(0, data.specularColor, g_localParams.oneMinusReflectivity, data.smoothness, data.normalWorld, g_localParams.Vworld, light, ind).rgb;
|
|
}
|
|
|
|
|
|
half4 frag (v2f i) : SV_Target
|
|
{
|
|
uint2 pixCoord = ((uint2) i.vertex.xy);
|
|
|
|
float zbufDpth = FetchDepth(_CameraDepthTexture, pixCoord.xy).x;
|
|
float linDepth = GetLinearDepth(zbufDpth);
|
|
|
|
float3 vP = GetViewPosFromLinDepth(i.vertex.xy, linDepth);
|
|
float3 vPw = mul(g_mViewToWorld, float4(vP, 1)).xyz;
|
|
float3 Vworld = normalize(mul((float3x3) g_mViewToWorld, -vP).xyz); //unity_CameraToWorld
|
|
|
|
float4 gbuffer0 = _CameraGBufferTexture0.Load( uint3(pixCoord.xy, 0) );
|
|
float4 gbuffer1 = _CameraGBufferTexture1.Load( uint3(pixCoord.xy, 0) );
|
|
float4 gbuffer2 = _CameraGBufferTexture2.Load( uint3(pixCoord.xy, 0) );
|
|
|
|
StandardData data = UnityStandardDataFromGbufferAux(gbuffer0, gbuffer1, gbuffer2);
|
|
|
|
g_localParams.gbuf = data;
|
|
g_localParams.oneMinusReflectivity = 1.0 - SpecularStrength(data.specularColor.rgb);
|
|
g_localParams.Vworld = Vworld;
|
|
|
|
uint numReflectionsProcessed = 0;
|
|
float3 c = ExecuteReflectionList(numReflectionsProcessed, pixCoord, vP, data.normalWorld, Vworld, data.smoothness);
|
|
|
|
#if ENABLE_DEBUG
|
|
c = OverlayHeatMap(pixCoord & 15, numReflectionsProcessed, c);
|
|
#endif
|
|
|
|
return float4(c,1.0);
|
|
}
|
|
|
|
|
|
|
|
ENDCG
|
|
}
|
|
|
|
}
|
|
Fallback Off
|
|
}
|