Felipe Lira
8 年前
当前提交
fba67c86
共有 10 个文件被更改,包括 233 次插入 和 246 次删除
-
12Assets/LowEndMobilePipeline/Editor/LegacyMobileToLowendMobileUpgrader.cs
-
8Assets/LowEndMobilePipeline/Editor/LowendMobilePipelineMaterialEditor.cs
-
2Assets/LowEndMobilePipeline/Editor/StandardToLowEndMaterialUpgrader.cs
-
20Assets/LowEndMobilePipeline/LowEndMobilePipeline.cs
-
375Assets/LowEndMobilePipeline/LowEndMobilePipeline.shader
-
4Assets/LowEndMobilePipeline/LowEndMobilePipelineAsset.asset
-
2Assets/LowEndMobilePipeline/LowEndMobilePipelineAsset.asset.meta
-
4Assets/LowEndMobilePipeline/LowEndMobilePipelineAsset.cs
-
49Assets/LowEndMobilePipeline/LowEndMobilePipelineCore.cginc
-
3Assets/LowEndMobilePipeline/TestScenes/Materials/LDRenderPipeMaterials/MobileColorsTile.mat
|
|||
// Shader targeted for LowEnd mobile devices. Single Pass Forward Rendering. Shader Model 2 |
|||
Shader "ScriptableRenderPipeline/LowEndMobile" |
|||
{ |
|||
// Keep properties of StandardSpecular shader for upgrade reasons. |
|||
Properties |
|||
{ |
|||
_Color("Color", Color) = (1,1,1,1) |
|||
_MainTex("Base (RGB) Glossiness / Alpha (A)", 2D) = "white" {} |
|||
// Keep properties of StandardSpecular shader for upgrade reasons. |
|||
Properties |
|||
{ |
|||
_Color("Color", Color) = (1,1,1,1) |
|||
_MainTex("Base (RGB) Glossiness / Alpha (A)", 2D) = "white" {} |
|||
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 |
|||
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5 |
|||
_Glossiness("Shininess", Range(0.0, 1.0)) = 0.5 |
|||
_SpecularStrength("Specular Strength", Range(0.0, 255.0)) = 200 |
|||
_GlossMapScale("Smoothness Factor", Range(0.0, 1.0)) = 1.0 |
|||
[Enum(Specular Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0 |
|||
_Glossiness("Shininess", Range(0.0, 1.0)) = 0.5 |
|||
_SpecularStrength("Specular Strength", Range(0.0, 255.0)) = 200 |
|||
_GlossMapScale("Smoothness Factor", Range(0.0, 1.0)) = 1.0 |
|||
[Enum(Specular Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0 |
|||
[HideInInspector] _SpecSource("Specular Color Source", Float) = 0.0 |
|||
_SpecColor("Specular", Color) = (1.0, 1.0, 1.0) |
|||
_SpecGlossMap("Specular", 2D) = "white" {} |
|||
[HideInInspector] _GlossinessSource("Glossiness Source", Float) = 0.0 |
|||
[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 |
|||
[ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0 |
|||
[HideInInspector] _SpecSource("Specular Color Source", Float) = 0.0 |
|||
_SpecColor("Specular", Color) = (1.0, 1.0, 1.0) |
|||
_SpecGlossMap("Specular", 2D) = "white" {} |
|||
[HideInInspector] _GlossinessSource("Glossiness Source", Float) = 0.0 |
|||
[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 |
|||
[ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0 |
|||
[HideInInspector] _BumpScale("Scale", Float) = 1.0 |
|||
[NoScaleOffset] _BumpMap("Normal Map", 2D) = "bump" {} |
|||
[HideInInspector] _BumpScale("Scale", Float) = 1.0 |
|||
[NoScaleOffset] _BumpMap("Normal Map", 2D) = "bump" {} |
|||
_Parallax("Height Scale", Range(0.005, 0.08)) = 0.02 |
|||
_ParallaxMap("Height Map", 2D) = "black" {} |
|||
_Parallax("Height Scale", Range(0.005, 0.08)) = 0.02 |
|||
_ParallaxMap("Height Map", 2D) = "black" {} |
|||
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0 |
|||
_OcclusionMap("Occlusion", 2D) = "white" {} |
|||
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0 |
|||
_OcclusionMap("Occlusion", 2D) = "white" {} |
|||
_EmissionColor("Emission Color", Color) = (0,0,0) |
|||
_EmissionMap("Emission", 2D) = "white" {} |
|||
_EmissionColor("Emission Color", Color) = (0,0,0) |
|||
_EmissionMap("Emission", 2D) = "white" {} |
|||
_DetailMask("Detail Mask", 2D) = "white" {} |
|||
_DetailMask("Detail Mask", 2D) = "white" {} |
|||
_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {} |
|||
_DetailNormalMapScale("Scale", Float) = 1.0 |
|||
_DetailNormalMap("Normal Map", 2D) = "bump" {} |
|||
_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {} |
|||
_DetailNormalMapScale("Scale", Float) = 1.0 |
|||
_DetailNormalMap("Normal Map", 2D) = "bump" {} |
|||
[Enum(UV0,0,UV1,1)] _UVSec("UV Set for secondary textures", Float) = 0 |
|||
[Enum(UV0,0,UV1,1)] _UVSec("UV Set for secondary textures", Float) = 0 |
|||
// Blending state |
|||
[HideInInspector] _Mode("__mode", Float) = 0.0 |
|||
[HideInInspector] _SrcBlend("__src", Float) = 1.0 |
|||
[HideInInspector] _DstBlend("__dst", Float) = 0.0 |
|||
[HideInInspector] _ZWrite("__zw", Float) = 1.0 |
|||
} |
|||
// Blending state |
|||
[HideInInspector] _Mode("__mode", Float) = 0.0 |
|||
[HideInInspector] _SrcBlend("__src", Float) = 1.0 |
|||
[HideInInspector] _DstBlend("__dst", Float) = 0.0 |
|||
[HideInInspector] _ZWrite("__zw", Float) = 1.0 |
|||
} |
|||
SubShader |
|||
{ |
|||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "LowEndMobilePipeline" } |
|||
LOD 300 |
|||
SubShader |
|||
{ |
|||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "LowEndMobilePipeline" } |
|||
LOD 300 |
|||
Pass |
|||
{ |
|||
Name "LD_SINGLE_PASS_FORWARD" |
|||
Tags { "LightMode" = "LowEndMobileForward" } |
|||
Pass |
|||
{ |
|||
Name "LD_SINGLE_PASS_FORWARD" |
|||
Tags { "LightMode" = "LowEndMobileForward" } |
|||
// Use same blending / depth states as Standard shader |
|||
Blend[_SrcBlend][_DstBlend] |
|||
ZWrite[_ZWrite] |
|||
// Use same blending / depth states as Standard shader |
|||
Blend[_SrcBlend][_DstBlend] |
|||
ZWrite[_ZWrite] |
|||
CGPROGRAM |
|||
#pragma target 2.0 |
|||
#pragma vertex vert |
|||
#pragma fragment frag |
|||
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON |
|||
#pragma shader_feature _ _SHARED_SPECULAR_DIFFUSE _SPECGLOSSMAP _SPECULAR_COLOR |
|||
#pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA |
|||
#pragma shader_feature _NORMALMAP |
|||
CGPROGRAM |
|||
#pragma target 2.0 |
|||
#pragma vertex vert |
|||
#pragma fragment frag |
|||
#pragma shader_feature _ _ALPHATEST_ON _ALPHABLEND_ON |
|||
#pragma shader_feature _ _SHARED_SPECULAR_DIFFUSE _SPECGLOSSMAP _SPECULAR_COLOR |
|||
#pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA |
|||
#pragma shader_feature _NORMALMAP |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile _ HARD_SHADOWS SOFT_SHADOWS |
|||
#pragma multi_compile_fog |
|||
#pragma only_renderers d3d9 d3d11 d3d11_9x glcore gles gles3 metal |
|||
#pragma enable_d3d11_debug_symbols |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile _ HARD_SHADOWS SOFT_SHADOWS |
|||
#pragma multi_compile_fog |
|||
#pragma only_renderers d3d9 d3d11 d3d11_9x glcore gles gles3 metal |
|||
#pragma enable_d3d11_debug_symbols |
|||
#include "UnityCG.cginc" |
|||
#include "UnityStandardBRDF.cginc" |
|||
#include "UnityStandardInput.cginc" |
|||
#include "UnityStandardUtils.cginc" |
|||
#include "UnityCG.cginc" |
|||
#include "UnityStandardBRDF.cginc" |
|||
#include "UnityStandardInput.cginc" |
|||
#include "UnityStandardUtils.cginc" |
|||
v2f vert(LowendVertexInput v) |
|||
{ |
|||
v2f o; |
|||
UNITY_INITIALIZE_OUTPUT(v2f, o); |
|||
v2f vert(LowendVertexInput v) |
|||
{ |
|||
v2f o; |
|||
UNITY_INITIALIZE_OUTPUT(v2f, o); |
|||
o.uv01.xy = TRANSFORM_TEX(v.texcoord, _MainTex); |
|||
o.uv01.zw = v.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw; |
|||
o.hpos = UnityObjectToClipPos(v.vertex); |
|||
o.uv01.xy = TRANSFORM_TEX(v.texcoord, _MainTex); |
|||
o.uv01.zw = v.lightmapUV * unity_LightmapST.xy + unity_LightmapST.zw; |
|||
o.hpos = UnityObjectToClipPos(v.vertex); |
|||
o.posWS.xyz = mul(unity_ObjectToWorld, v.vertex).xyz; |
|||
o.posWS.w = -UnityObjectToViewPos(v.vertex).z; |
|||
o.posWS.xyz = mul(unity_ObjectToWorld, v.vertex).xyz; |
|||
o.viewDir.xyz = normalize(_WorldSpaceCameraPos - o.posWS.xyz); |
|||
half3 normal = normalize(UnityObjectToWorldNormal(v.normal)); |
|||
o.viewDir.xyz = normalize(_WorldSpaceCameraPos - o.posWS.xyz); |
|||
half3 normal = normalize(UnityObjectToWorldNormal(v.normal)); |
|||
half sign = v.tangent.w * unity_WorldTransformParams.w; |
|||
half3 tangent = normalize(UnityObjectToWorldDir(v.tangent)); |
|||
half3 binormal = cross(normal, tangent) * v.tangent.w; |
|||
half sign = v.tangent.w * unity_WorldTransformParams.w; |
|||
half3 tangent = normalize(UnityObjectToWorldDir(v.tangent)); |
|||
half3 binormal = cross(normal, tangent) * v.tangent.w; |
|||
// Initialize tangetToWorld in column-major to benefit from better glsl matrix multiplication code |
|||
o.tangentToWorld[0] = half3(tangent.x, binormal.x, normal.x); |
|||
o.tangentToWorld[1] = half3(tangent.y, binormal.y, normal.y); |
|||
o.tangentToWorld[2] = half3(tangent.z, binormal.z, normal.z); |
|||
// Initialize tangetToWorld in column-major to benefit from better glsl matrix multiplication code |
|||
o.tangentToWorld[0] = half3(tangent.x, binormal.x, normal.x); |
|||
o.tangentToWorld[1] = half3(tangent.y, binormal.y, normal.y); |
|||
o.tangentToWorld[2] = half3(tangent.z, binormal.z, normal.z); |
|||
o.normal = normal; |
|||
o.normal = normal; |
|||
half4 diffuseAndSpecular = half4(1.0, 1.0, 1.0, 1.0); |
|||
for (int lightIndex = globalLightCount.x; lightIndex < globalLightCount.y; ++lightIndex) |
|||
{ |
|||
LightInput lightInput; |
|||
INITIALIZE_LIGHT(lightInput, lightIndex); |
|||
o.fogCoord.yzw += EvaluateOneLight(lightInput, diffuseAndSpecular.rgb, diffuseAndSpecular, normal, o.posWS.xyz, o.viewDir.xyz); |
|||
} |
|||
half4 diffuseAndSpecular = half4(1.0, 1.0, 1.0, 1.0); |
|||
for (int lightIndex = globalLightCount.x; lightIndex < globalLightCount.y; ++lightIndex) |
|||
{ |
|||
LightInput lightInput; |
|||
INITIALIZE_LIGHT(lightInput, lightIndex); |
|||
o.fogCoord.yzw += EvaluateOneLight(lightInput, diffuseAndSpecular.rgb, diffuseAndSpecular, normal, o.posWS.xyz, o.viewDir.xyz); |
|||
} |
|||
o.fogCoord.yzw += max(half3(0, 0, 0), ShadeSH9(half4(normal, 1))); |
|||
o.fogCoord.yzw += max(half3(0, 0, 0), ShadeSH9(half4(normal, 1))); |
|||
UNITY_TRANSFER_FOG(o, o.hpos); |
|||
return o; |
|||
} |
|||
UNITY_TRANSFER_FOG(o, o.hpos); |
|||
return o; |
|||
} |
|||
half4 frag(v2f i) : SV_Target |
|||
{ |
|||
half4 diffuseAlpha = tex2D(_MainTex, i.uv01.xy); |
|||
half3 diffuse = diffuseAlpha.rgb * _Color.rgb; |
|||
half alpha = diffuseAlpha.a * _Color.a; |
|||
half4 frag(v2f i) : SV_Target |
|||
{ |
|||
half4 diffuseAlpha = tex2D(_MainTex, i.uv01.xy); |
|||
half3 diffuse = diffuseAlpha.rgb * _Color.rgb; |
|||
half alpha = diffuseAlpha.a * _Color.a; |
|||
// Keep for compatibility reasons. Shader Inpector throws a warning when using cutoff |
|||
// due overdraw performance impact. |
|||
clip(alpha - _Cutoff); |
|||
clip(alpha - _Cutoff); |
|||
half4 specularGloss; |
|||
half4 specularGloss; |
|||
// Indirect Light Contribution |
|||
half3 indirectDiffuse; |
|||
// Indirect Light Contribution |
|||
half3 indirectDiffuse; |
|||
// Compute direct contribution from main directional light. |
|||
// Only a single directional shadow caster is supported. |
|||
LightInput mainLight; |
|||
INITIALIZE_LIGHT(mainLight, 0); |
|||
// Compute direct contribution from main directional light. |
|||
// Only a single directional shadow caster is supported. |
|||
LightInput mainLight; |
|||
INITIALIZE_LIGHT(mainLight, 0); |
|||
return half4(EvaluateMainLight(mainLight, diffuse, specularGloss, normal, i.posWS, viewDir), 1.0); |
|||
return half4(EvaluateMainLight(mainLight, diffuse, specularGloss, normal, i.posWS, viewDir), 1.0); |
|||
// Compute direct contribution from additional lights. |
|||
for (int lightIndex = 1; lightIndex < globalLightCount.x; ++lightIndex) |
|||
{ |
|||
LightInput additionalLight; |
|||
INITIALIZE_LIGHT(additionalLight, lightIndex); |
|||
directColor += EvaluateOneLight(additionalLight, diffuse, specularGloss, normal, posWorld, viewDir); |
|||
} |
|||
// Compute direct contribution from additional lights. |
|||
for (int lightIndex = 1; lightIndex < globalLightCount.x; ++lightIndex) |
|||
{ |
|||
LightInput additionalLight; |
|||
INITIALIZE_LIGHT(additionalLight, lightIndex); |
|||
directColor += EvaluateOneLight(additionalLight, diffuse, specularGloss, normal, posWorld, viewDir); |
|||
} |
|||
half3 color = directColor + indirectDiffuse + _EmissionColor; |
|||
UNITY_APPLY_FOG(i.fogCoord, color); |
|||
half3 color = directColor + indirectDiffuse + _EmissionColor; |
|||
UNITY_APPLY_FOG(i.fogCoord, color); |
|||
}; |
|||
ENDCG |
|||
} |
|||
}; |
|||
ENDCG |
|||
} |
|||
Pass |
|||
{ |
|||
Name "LD_SHADOW_CASTER" |
|||
Tags { "Lightmode" = "ShadowCaster" } |
|||
Pass |
|||
{ |
|||
Name "LD_SHADOW_CASTER" |
|||
Tags { "Lightmode" = "ShadowCaster" } |
|||
ZWrite On ZTest LEqual |
|||
ZWrite On ZTest LEqual |
|||
CGPROGRAM |
|||
#pragma target 2.0 |
|||
#pragma vertex vert |
|||
#pragma fragment frag |
|||
CGPROGRAM |
|||
#pragma target 2.0 |
|||
#pragma vertex vert |
|||
#pragma fragment frag |
|||
float4 _WorldLightDirAndBias; |
|||
float4 _WorldLightDirAndBias; |
|||
#include "UnityCG.cginc" |
|||
#include "UnityCG.cginc" |
|||
struct VertexInput |
|||
{ |
|||
float4 pos : POSITION; |
|||
float3 normal : NORMAL; |
|||
}; |
|||
struct VertexInput |
|||
{ |
|||
float4 pos : POSITION; |
|||
float3 normal : NORMAL; |
|||
}; |
|||
// Similar to UnityClipSpaceShadowCasterPos but using LDPipeline lightdir and bias and applying near plane clamp |
|||
float4 ClipSpaceShadowCasterPos(float4 vertex, float3 normal) |
|||
{ |
|||
float4 wPos = mul(unity_ObjectToWorld, vertex); |
|||
// Similar to UnityClipSpaceShadowCasterPos but using LDPipeline lightdir and bias and applying near plane clamp |
|||
float4 ClipSpaceShadowCasterPos(float4 vertex, float3 normal) |
|||
{ |
|||
float4 wPos = mul(unity_ObjectToWorld, vertex); |
|||
if (_WorldLightDirAndBias.w > 0.0) |
|||
{ |
|||
float3 wNormal = UnityObjectToWorldNormal(normal); |
|||
if (_WorldLightDirAndBias.w > 0.0) |
|||
{ |
|||
float3 wNormal = UnityObjectToWorldNormal(normal); |
|||
// apply normal offset bias (inset position along the normal) |
|||
// bias needs to be scaled by sine between normal and light direction |
|||
// (http://the-witness.net/news/2013/09/shadow-mapping-summary-part-1/) |
|||
// |
|||
// _WorldLightDirAndBias.w shadow bias defined in LRRenderPipeline asset |
|||
// apply normal offset bias (inset position along the normal) |
|||
// bias needs to be scaled by sine between normal and light direction |
|||
// (http://the-witness.net/news/2013/09/shadow-mapping-summary-part-1/) |
|||
// |
|||
// _WorldLightDirAndBias.w shadow bias defined in LRRenderPipeline asset |
|||
float shadowCos = dot(wNormal, _WorldLightDirAndBias.xyz); |
|||
float shadowSine = sqrt(1 - shadowCos*shadowCos); |
|||
float normalBias = _WorldLightDirAndBias.w * shadowSine; |
|||
float shadowCos = dot(wNormal, _WorldLightDirAndBias.xyz); |
|||
float shadowSine = sqrt(1 - shadowCos*shadowCos); |
|||
float normalBias = _WorldLightDirAndBias.w * shadowSine; |
|||
wPos.xyz -= wNormal * normalBias; |
|||
} |
|||
wPos.xyz -= wNormal * normalBias; |
|||
} |
|||
float4 clipPos = mul(UNITY_MATRIX_VP, wPos); |
|||
float4 clipPos = mul(UNITY_MATRIX_VP, wPos); |
|||
clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); |
|||
clipPos.z = min(clipPos.z, UNITY_NEAR_CLIP_VALUE); |
|||
clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); |
|||
clipPos.z = max(clipPos.z, UNITY_NEAR_CLIP_VALUE); |
|||
return clipPos; |
|||
} |
|||
return clipPos; |
|||
} |
|||
float4 vert(VertexInput i) : SV_POSITION |
|||
{ |
|||
return ClipSpaceShadowCasterPos(i.pos, i.normal); |
|||
} |
|||
float4 vert(VertexInput i) : SV_POSITION |
|||
{ |
|||
return ClipSpaceShadowCasterPos(i.pos, i.normal); |
|||
} |
|||
half4 frag() : SV_TARGET |
|||
{ |
|||
return 0; |
|||
} |
|||
ENDCG |
|||
} |
|||
half4 frag() : SV_TARGET |
|||
{ |
|||
return 0; |
|||
} |
|||
ENDCG |
|||
} |
|||
// This pass it not used during regular rendering, only for lightmap baking. |
|||
Pass |
|||
{ |
|||
Name "LD_META" |
|||
Tags{ "LightMode" = "Meta" } |
|||
// This pass it not used during regular rendering, only for lightmap baking. |
|||
Pass |
|||
{ |
|||
Name "LD_META" |
|||
Tags{ "LightMode" = "Meta" } |
|||
Cull Off |
|||
Cull Off |
|||
CGPROGRAM |
|||
#pragma vertex vert_meta |
|||
#pragma fragment frag_meta |
|||
CGPROGRAM |
|||
#pragma vertex vert_meta |
|||
#pragma fragment frag_meta |
|||
#pragma shader_feature _EMISSION |
|||
#pragma shader_feature _METALLICGLOSSMAP |
|||
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
#pragma shader_feature ___ _DETAIL_MULX2 |
|||
#pragma shader_feature EDITOR_VISUALIZATION |
|||
#pragma shader_feature _EMISSION |
|||
#pragma shader_feature _METALLICGLOSSMAP |
|||
#pragma shader_feature _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
#pragma shader_feature ___ _DETAIL_MULX2 |
|||
#pragma shader_feature EDITOR_VISUALIZATION |
|||
#include "UnityStandardMeta.cginc" |
|||
ENDCG |
|||
} |
|||
} |
|||
Fallback "Standard (Specular setup)" |
|||
CustomEditor "LowendMobilePipelineMaterialEditor" |
|||
#include "UnityStandardMeta.cginc" |
|||
ENDCG |
|||
} |
|||
} |
|||
Fallback "Standard (Specular setup)" |
|||
CustomEditor "LowendMobilePipelineMaterialEditor" |
|||
} |
撰写
预览
正在加载...
取消
保存
Reference in new issue