198 lines
6.3 KiB
HLSL
198 lines
6.3 KiB
HLSL
#ifndef GPU_INSTANCER_STANDARD_INCLUDED
|
|
#define GPU_INSTANCER_STANDARD_INCLUDED
|
|
|
|
// FORWARD RENDERING:
|
|
#if !UNITY_STANDARD_SIMPLE
|
|
half4 fragForwardBaseInternalGPUI(VertexOutputForwardBase i)
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
#if UNITY_VERSION >= 201711
|
|
UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
|
|
#endif
|
|
|
|
FRAGMENT_SETUP(s);
|
|
|
|
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
|
|
|
|
UnityLight mainLight = MainLight();
|
|
UNITY_LIGHT_ATTENUATION(atten, i, s.posWorld);
|
|
|
|
half occlusion = Occlusion(i.tex.xy);
|
|
UnityGI gi = FragmentGI(s, occlusion, i.ambientOrLightmapUV, atten, mainLight);
|
|
|
|
half4 c = UNITY_BRDF_PBS(s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect);
|
|
c.rgb += Emission(i.tex.xy);
|
|
|
|
#ifdef UNITY_EXTRACT_FOG_FROM_EYE_VEC
|
|
UNITY_EXTRACT_FOG_FROM_EYE_VEC(i);
|
|
#endif
|
|
#if UNITY_VERSION > 201820
|
|
UNITY_APPLY_FOG(_unity_fogCoord, c.rgb);
|
|
#else
|
|
UNITY_APPLY_FOG(i.fogCoord, c.rgb);
|
|
#endif
|
|
return OutputForward(c, s.alpha);
|
|
}
|
|
#endif
|
|
|
|
#if UNITY_STANDARD_SIMPLE
|
|
half4 fragBaseAllGPUI (VertexOutputBaseSimple i) : SV_Target { return fragForwardBaseSimpleInternal(i); }
|
|
#else
|
|
half4 fragBaseAllGPUI(VertexOutputForwardBase i) : SV_Target { return fragForwardBaseInternalGPUI(i); }
|
|
#endif
|
|
|
|
// DEFERRED RENDERING
|
|
#ifndef UNITY_POSITION
|
|
#define UNITY_POSITION(pos) float4 pos : SV_POSITION
|
|
#endif
|
|
|
|
struct VertexOutputDeferredGPUI
|
|
{
|
|
UNITY_POSITION(pos);
|
|
float4 tex : TEXCOORD0;
|
|
#if UNITY_VERSION == 565 || UNITY_VERSION == 201710 || UNITY_VERSION == 201711 || UNITY_VERSION == 201712 || UNITY_VERSION == 201713 || UNITY_VERSION == 201730 || UNITY_VERSION == 201731 || UNITY_VERSION == 201720 || UNITY_VERSION == 201721 || UNITY_VERSION == 201722
|
|
half3 eyeVec : TEXCOORD1;
|
|
half4 tangentToWorldAndPackedData[3] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax or worldPos]
|
|
#else
|
|
float3 eyeVec : TEXCOORD1;
|
|
float4 tangentToWorldAndPackedData[3] : TEXCOORD2; // [3x3:tangentToWorld | 1x3:viewDirForParallax or worldPos]
|
|
#endif
|
|
|
|
half4 ambientOrLightmapUV : TEXCOORD5; // SH or Lightmap UVs
|
|
|
|
#if UNITY_REQUIRE_FRAG_WORLDPOS && !UNITY_PACK_WORLDPOS_WITH_TANGENT
|
|
float3 posWorld : TEXCOORD6;
|
|
#endif
|
|
|
|
UNITY_VERTEX_INPUT_INSTANCE_ID
|
|
UNITY_VERTEX_OUTPUT_STEREO
|
|
};
|
|
|
|
VertexOutputDeferredGPUI vertDeferredGPUI(VertexInput v)
|
|
{
|
|
UNITY_SETUP_INSTANCE_ID(v);
|
|
VertexOutputDeferredGPUI o;
|
|
UNITY_INITIALIZE_OUTPUT(VertexOutputDeferredGPUI, o);
|
|
UNITY_TRANSFER_INSTANCE_ID(v, o);
|
|
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
|
|
|
float4 posWorld = mul(unity_ObjectToWorld, v.vertex);
|
|
#if UNITY_REQUIRE_FRAG_WORLDPOS
|
|
#if UNITY_PACK_WORLDPOS_WITH_TANGENT
|
|
o.tangentToWorldAndPackedData[0].w = posWorld.x;
|
|
o.tangentToWorldAndPackedData[1].w = posWorld.y;
|
|
o.tangentToWorldAndPackedData[2].w = posWorld.z;
|
|
#else
|
|
o.posWorld = posWorld.xyz;
|
|
#endif
|
|
#endif
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
|
|
|
o.tex = TexCoords(v);
|
|
o.eyeVec = NormalizePerVertexNormal(posWorld.xyz - _WorldSpaceCameraPos);
|
|
float3 normalWorld = UnityObjectToWorldNormal(v.normal);
|
|
#ifdef _TANGENT_TO_WORLD
|
|
float4 tangentWorld = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
|
|
|
|
float3x3 tangentToWorld = CreateTangentToWorldPerVertex(normalWorld, tangentWorld.xyz, tangentWorld.w);
|
|
o.tangentToWorldAndPackedData[0].xyz = tangentToWorld[0];
|
|
o.tangentToWorldAndPackedData[1].xyz = tangentToWorld[1];
|
|
o.tangentToWorldAndPackedData[2].xyz = tangentToWorld[2];
|
|
#else
|
|
o.tangentToWorldAndPackedData[0].xyz = 0;
|
|
o.tangentToWorldAndPackedData[1].xyz = 0;
|
|
o.tangentToWorldAndPackedData[2].xyz = normalWorld;
|
|
#endif
|
|
|
|
o.ambientOrLightmapUV = 0;
|
|
#ifdef LIGHTMAP_ON
|
|
o.ambientOrLightmapUV.xy = v.uv1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
|
|
#elif UNITY_SHOULD_SAMPLE_SH
|
|
o.ambientOrLightmapUV.rgb = ShadeSHPerVertex (normalWorld, o.ambientOrLightmapUV.rgb);
|
|
#endif
|
|
#ifdef DYNAMICLIGHTMAP_ON
|
|
o.ambientOrLightmapUV.zw = v.uv2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;
|
|
#endif
|
|
|
|
#ifdef _PARALLAXMAP
|
|
TANGENT_SPACE_ROTATION;
|
|
half3 viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
|
|
o.tangentToWorldAndPackedData[0].w = viewDirForParallax.x;
|
|
o.tangentToWorldAndPackedData[1].w = viewDirForParallax.y;
|
|
o.tangentToWorldAndPackedData[2].w = viewDirForParallax.z;
|
|
#endif
|
|
|
|
return o;
|
|
}
|
|
|
|
void fragDeferredGPUI(VertexOutputDeferredGPUI i,
|
|
out half4 outGBuffer0 : SV_Target0,
|
|
out half4 outGBuffer1 : SV_Target1,
|
|
out half4 outGBuffer2 : SV_Target2,
|
|
out half4 outEmission : SV_Target3 // RT3: emission (rgb), --unused-- (a)
|
|
#if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4)
|
|
,out half4 outShadowMask : SV_Target4 // RT4: shadowmask (rgba)
|
|
#endif
|
|
)
|
|
{
|
|
#if (SHADER_TARGET < 30)
|
|
outGBuffer0 = 1;
|
|
outGBuffer1 = 1;
|
|
outGBuffer2 = 0;
|
|
outEmission = 0;
|
|
#if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4)
|
|
outShadowMask = 1;
|
|
#endif
|
|
return;
|
|
#endif
|
|
UNITY_SETUP_INSTANCE_ID(i);
|
|
#if UNITY_VERSION >= 201711
|
|
UNITY_APPLY_DITHER_CROSSFADE(i.pos.xy);
|
|
#endif
|
|
|
|
FRAGMENT_SETUP(s);
|
|
|
|
|
|
// no analytic lights in this pass
|
|
UnityLight dummyLight = DummyLight();
|
|
half atten = 1;
|
|
|
|
// only GI
|
|
half occlusion = Occlusion(i.tex.xy);
|
|
#if UNITY_ENABLE_REFLECTION_BUFFERS
|
|
bool sampleReflectionsInDeferred = false;
|
|
#else
|
|
bool sampleReflectionsInDeferred = true;
|
|
#endif
|
|
|
|
UnityGI gi = FragmentGI(s, occlusion, i.ambientOrLightmapUV, atten, dummyLight, sampleReflectionsInDeferred);
|
|
|
|
half3 emissiveColor = UNITY_BRDF_PBS(s.diffColor, s.specColor, s.oneMinusReflectivity, s.smoothness, s.normalWorld, -s.eyeVec, gi.light, gi.indirect).rgb;
|
|
|
|
#ifdef _EMISSION
|
|
emissiveColor += Emission (i.tex.xy);
|
|
#endif
|
|
|
|
#ifndef UNITY_HDR_ON
|
|
emissiveColor.rgb = exp2(-emissiveColor.rgb);
|
|
#endif
|
|
|
|
UnityStandardData data;
|
|
data.diffuseColor = s.diffColor;
|
|
data.occlusion = occlusion;
|
|
data.specularColor = s.specColor;
|
|
data.smoothness = s.smoothness;
|
|
data.normalWorld = s.normalWorld;
|
|
|
|
UnityStandardDataToGbuffer(data, outGBuffer0, outGBuffer1, outGBuffer2);
|
|
|
|
// Emissive lighting buffer
|
|
outEmission = half4(emissiveColor, 1);
|
|
|
|
// Baked direct lighting occlusion if any
|
|
#if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4)
|
|
outShadowMask = UnityGetRawBakedOcclusions(i.ambientOrLightmapUV.xy, IN_WORLDPOS(i));
|
|
#endif
|
|
}
|
|
|
|
#endif |