mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-02-04 22:34:53 +08:00
[unity] Sprite Shaders updated.
This commit is contained in:
parent
9c21942482
commit
ee1028bb13
@ -35,12 +35,26 @@ using UnityEditor;
|
||||
using SpineInspectorUtility = Spine.Unity.Editor.SpineInspectorUtility;
|
||||
|
||||
public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
static readonly string kShaderVertexLit = "Spine/Sprite/Vertex Lit";
|
||||
static readonly string kShaderPixelLit = "Spine/Sprite/Pixel Lit";
|
||||
static readonly string kShaderUnlit = "Spine/Sprite/Unlit";
|
||||
static readonly int kSolidQueue = 2000;
|
||||
static readonly int kAlphaTestQueue = 2450;
|
||||
static readonly int kTransparentQueue = 3000;
|
||||
|
||||
#region Constants
|
||||
const string ShaderVertexLit = "Spine/Sprite/Vertex Lit";
|
||||
const string ShaderPixelLit = "Spine/Sprite/Pixel Lit";
|
||||
const string ShaderUnlit = "Spine/Sprite/Unlit";
|
||||
|
||||
const int SolidQueue = 2000;
|
||||
const int AlphaTestQueue = 2450;
|
||||
const int TransparentQueue = 3000;
|
||||
|
||||
const string PremultipledAlpha = "_ALPHAPREMULTIPLY_ON";
|
||||
const string Multiply = "_MULTIPLYBLEND";
|
||||
const string Multiply2x = "_MULTIPLYBLEND_X2";
|
||||
const string Additive = "_ADDITIVEBLEND";
|
||||
const string SoftAdditive = "_ADDITIVEBLEND_SOFT";
|
||||
|
||||
const string _FIXED_NORMALS = "_FIXED_NORMALS";
|
||||
const string _FIXED_NORMALS_BACK_RENDERING = "_FIXED_NORMALS_BACK_RENDERING";
|
||||
|
||||
const string _SPHERICAL_HARMONICS = "_SPHERICAL_HARMONICS";
|
||||
|
||||
enum eBlendMode {
|
||||
PreMultipliedAlpha,
|
||||
@ -59,10 +73,10 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
Back = 2,
|
||||
Front = 1,
|
||||
}
|
||||
#endregion
|
||||
|
||||
MaterialProperty _mainTexture = null;
|
||||
MaterialProperty _color = null;
|
||||
MaterialProperty _blendMode = null;
|
||||
|
||||
MaterialProperty _emissionMap = null;
|
||||
MaterialProperty _emissionColor = null;
|
||||
@ -116,16 +130,21 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
|
||||
public override void AssignNewShaderToMaterial (Material material, Shader oldShader, Shader newShader) {
|
||||
base.AssignNewShaderToMaterial(material, oldShader, newShader);
|
||||
|
||||
if (!(oldShader == Shader.Find(ShaderPixelLit) || oldShader == Shader.Find(ShaderVertexLit) || oldShader == Shader.Find(ShaderUnlit)))
|
||||
SetDefaultSpriteKeywords(material, newShader);
|
||||
|
||||
SetMaterialKeywords(material);
|
||||
SetLightModeFromShader(material);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Virtual Interface
|
||||
protected virtual void FindProperties (MaterialProperty[] props) {
|
||||
_mainTexture = FindProperty("_MainTex", props);
|
||||
_color = FindProperty("_Color", props);
|
||||
_blendMode = FindProperty("_BlendMode", props);
|
||||
|
||||
_emissionMap = FindProperty("_EmissionMap", props, false);
|
||||
_emissionColor = FindProperty("_EmissionColor", props, false);
|
||||
@ -184,6 +203,16 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
EditorGUI.BeginChangeCheck();
|
||||
bool fog = EditorGUILayout.Toggle("Use fog", material.IsKeywordEnabled("_FOG"));
|
||||
if (EditorGUI.EndChangeCheck()) SetKeyword(material, "_FOG", fog);
|
||||
|
||||
EditorGUI.BeginChangeCheck();
|
||||
bool enabled = EditorGUILayout.Toggle(
|
||||
new GUIContent(
|
||||
"Use Spherical Harmonics",
|
||||
"Enable to use spherical harmonics to calculate ambient light / light probes. In vertex-lit mode this will be approximated from scenes ambient trilight settings."),
|
||||
material.IsKeywordEnabled(_SPHERICAL_HARMONICS)
|
||||
);
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
SetKeyword(material, _SPHERICAL_HARMONICS, enabled);
|
||||
}
|
||||
|
||||
using (new SpineInspectorUtility.BoxScope())
|
||||
@ -220,13 +249,13 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
EditorGUI.BeginChangeCheck();
|
||||
if (showAdvanced) {
|
||||
backRendering = EditorGUILayout.Toggle(new GUIContent("Fixed Normal Back Rendering", "Tick only if you are going to rotate the sprite to face away from the camera, the fixed normal will be flipped to compensate."),
|
||||
material.IsKeywordEnabled("_FIXED_NORMALS_BACK_RENDERING"));
|
||||
material.IsKeywordEnabled(_FIXED_NORMALS_BACK_RENDERING));
|
||||
} else {
|
||||
backRendering = material.IsKeywordEnabled("_FIXED_NORMALS_BACK_RENDERING");
|
||||
backRendering = material.IsKeywordEnabled(_FIXED_NORMALS_BACK_RENDERING);
|
||||
}
|
||||
if (EditorGUI.EndChangeCheck()) {
|
||||
SetKeyword(material, "_FIXED_NORMALS_BACK_RENDERING", backRendering);
|
||||
SetKeyword(material, "_FIXED_NORMALS", !backRendering);
|
||||
SetKeyword(material, _FIXED_NORMALS_BACK_RENDERING, backRendering);
|
||||
SetKeyword(material, _FIXED_NORMALS, !backRendering);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -259,8 +288,7 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
}
|
||||
}
|
||||
if (EditorGUI.EndChangeCheck()) {
|
||||
foreach (var obj in _blendMode.targets)
|
||||
MaterialChanged((Material)obj);
|
||||
MaterialChanged(material);
|
||||
}
|
||||
}
|
||||
|
||||
@ -293,13 +321,13 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
|
||||
bool UseMeshNormalsCheckbox (Material material) {
|
||||
EditorGUI.BeginChangeCheck();
|
||||
bool fixedNormals = material.IsKeywordEnabled("_FIXED_NORMALS");
|
||||
bool fixedNormalsBackRendering = material.IsKeywordEnabled("_FIXED_NORMALS_BACK_RENDERING");
|
||||
bool fixedNormals = material.IsKeywordEnabled(_FIXED_NORMALS);
|
||||
bool fixedNormalsBackRendering = material.IsKeywordEnabled(_FIXED_NORMALS_BACK_RENDERING);
|
||||
bool meshNormals = EditorGUILayout.Toggle(new GUIContent("Use Mesh Normals", "If this is unticked, a Fixed Normal value will be used instead of the vertex normals on the mesh. Using a fixed normal is better for performance and can result in better looking lighting effects on 2d objects."),
|
||||
!fixedNormals && !fixedNormalsBackRendering);
|
||||
if (EditorGUI.EndChangeCheck()) {
|
||||
SetKeyword(material, "_FIXED_NORMALS", meshNormals ? false : fixedNormalsBackRendering ? false : true);
|
||||
SetKeyword(material, "_FIXED_NORMALS_BACK_RENDERING", meshNormals ? false : fixedNormalsBackRendering);
|
||||
SetKeyword(material, _FIXED_NORMALS, meshNormals ? false : fixedNormalsBackRendering ? false : true);
|
||||
SetKeyword(material, _FIXED_NORMALS_BACK_RENDERING, meshNormals ? false : fixedNormalsBackRendering);
|
||||
}
|
||||
return meshNormals;
|
||||
}
|
||||
@ -331,20 +359,37 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
}
|
||||
#endregion
|
||||
|
||||
static void SetDefaultSpriteKeywords (Material material, Shader shader) {
|
||||
SetKeyword(material, "_EMISSION", false); // Disabled. standard shader sets this on by default.
|
||||
SetKeyword(material, PremultipledAlpha, true); // PMA by default
|
||||
SetKeyword(material, _FIXED_NORMALS, true); // Fixed normals by default, best for Spine.
|
||||
SetKeyword(material, _SPHERICAL_HARMONICS, true);
|
||||
}
|
||||
|
||||
void SetLightModeFromShader (Material material) {
|
||||
if (material.shader.name == kShaderPixelLit)
|
||||
if (material.shader.name == ShaderPixelLit)
|
||||
_lightMode = eLightMode.PixelLit;
|
||||
else if (material.shader.name == kShaderUnlit)
|
||||
else if (material.shader.name == ShaderUnlit)
|
||||
_lightMode = eLightMode.Unlit;
|
||||
else
|
||||
_lightMode = eLightMode.VertexLit;
|
||||
}
|
||||
|
||||
static void SetMaterialKeywords (Material material) {
|
||||
eBlendMode blendMode = (eBlendMode)material.GetFloat("_BlendMode");
|
||||
static void SetRenderQueue (Material material, string queue) {
|
||||
bool meshNormal = true;
|
||||
|
||||
if (material.HasProperty("_FixedNormal")) {
|
||||
bool fixedNormals = material.IsKeywordEnabled(_FIXED_NORMALS);
|
||||
bool fixedNormalsBackRendering = material.IsKeywordEnabled(_FIXED_NORMALS_BACK_RENDERING);
|
||||
meshNormal = !fixedNormals && !fixedNormalsBackRendering;
|
||||
}
|
||||
|
||||
material.SetOverrideTag("RenderType", meshNormal ? queue : "Sprite");
|
||||
}
|
||||
|
||||
static void SetMaterialKeywords (Material material) {
|
||||
bool normalMap = material.HasProperty("_BumpMap") && material.GetTexture("_BumpMap") != null;
|
||||
SetKeyword (material, "_NORMALMAP", normalMap);
|
||||
SetKeyword(material, "_NORMALMAP", normalMap);
|
||||
|
||||
bool zWrite = material.GetFloat("_ZWrite") > 0.0f;
|
||||
bool clipAlpha = zWrite && material.GetFloat("_Cutoff") > 0.0f;
|
||||
@ -356,11 +401,41 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
bool blendTexture = material.HasProperty("_BlendTex") && material.GetTexture("_BlendTex") != null;
|
||||
SetKeyword(material, "_TEXTURE_BLEND", blendTexture);
|
||||
|
||||
SetKeyword(material, "_ALPHAPREMULTIPLY_ON", blendMode == eBlendMode.PreMultipliedAlpha);
|
||||
SetKeyword(material, "_MULTIPLYBLEND", blendMode == eBlendMode.Multiply);
|
||||
SetKeyword(material, "_MULTIPLYBLEND_X2", blendMode == eBlendMode.Multiplyx2);
|
||||
SetKeyword(material, "_ADDITIVEBLEND", blendMode == eBlendMode.Additive);
|
||||
SetKeyword(material, "_ADDITIVEBLEND_SOFT", blendMode == eBlendMode.SoftAdditive);
|
||||
eBlendMode blendMode = GetMaterialBlendMode(material);
|
||||
SetBlendMode(material, blendMode);
|
||||
}
|
||||
|
||||
static eBlendMode GetMaterialBlendMode (Material material) {
|
||||
if (material.IsKeywordEnabled(PremultipledAlpha))
|
||||
return eBlendMode.PreMultipliedAlpha;
|
||||
if (material.IsKeywordEnabled(Multiply))
|
||||
return eBlendMode.Multiply;
|
||||
if (material.IsKeywordEnabled(Multiply2x))
|
||||
return eBlendMode.Multiplyx2;
|
||||
if (material.IsKeywordEnabled(Additive))
|
||||
return eBlendMode.Additive;
|
||||
if (material.IsKeywordEnabled(SoftAdditive))
|
||||
return eBlendMode.SoftAdditive;
|
||||
|
||||
return eBlendMode.StandardAlpha;
|
||||
}
|
||||
|
||||
void BlendModePopup () {
|
||||
var material = _materialEditor.target as Material;
|
||||
eBlendMode blendMode = GetMaterialBlendMode(material);
|
||||
EditorGUI.BeginChangeCheck();
|
||||
blendMode = (eBlendMode)EditorGUILayout.Popup("Blend Mode", (int)blendMode, Enum.GetNames(typeof(eBlendMode)));
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
SetBlendMode(material, blendMode);
|
||||
}
|
||||
|
||||
static void SetBlendMode (Material material, eBlendMode blendMode) {
|
||||
SetKeyword(material, PremultipledAlpha, blendMode == eBlendMode.PreMultipliedAlpha);
|
||||
SetKeyword(material, Multiply, blendMode == eBlendMode.Multiply);
|
||||
SetKeyword(material, Multiply2x, blendMode == eBlendMode.Multiplyx2);
|
||||
SetKeyword(material, Additive, blendMode == eBlendMode.Additive);
|
||||
SetKeyword(material, SoftAdditive, blendMode == eBlendMode.SoftAdditive);
|
||||
|
||||
int renderQueue;
|
||||
|
||||
@ -369,50 +444,51 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
{
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
||||
material.SetOverrideTag("RenderType", "Opaque");
|
||||
renderQueue = kSolidQueue;
|
||||
SetRenderQueue(material, "Opaque");
|
||||
renderQueue = SolidQueue;
|
||||
}
|
||||
break;
|
||||
case eBlendMode.Additive:
|
||||
{
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||
material.SetOverrideTag("RenderType", "Transparent");
|
||||
renderQueue = kTransparentQueue;
|
||||
SetRenderQueue(material, "Transparent");
|
||||
renderQueue = TransparentQueue;
|
||||
}
|
||||
break;
|
||||
case eBlendMode.SoftAdditive:
|
||||
{
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcColor);
|
||||
material.SetOverrideTag("RenderType", "Transparent");
|
||||
renderQueue = kTransparentQueue;
|
||||
SetRenderQueue(material, "Transparent");
|
||||
renderQueue = TransparentQueue;
|
||||
}
|
||||
break;
|
||||
case eBlendMode.Multiply:
|
||||
{
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.SrcColor);
|
||||
material.SetOverrideTag("RenderType", "Transparent");
|
||||
renderQueue = kTransparentQueue;
|
||||
SetRenderQueue(material, "Transparent");
|
||||
renderQueue = TransparentQueue;
|
||||
}
|
||||
break;
|
||||
case eBlendMode.Multiplyx2:
|
||||
{
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstColor);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.SrcColor);
|
||||
material.SetOverrideTag("RenderType", "Transparent");
|
||||
renderQueue = kTransparentQueue;
|
||||
SetRenderQueue(material, "Transparent");
|
||||
renderQueue = TransparentQueue;
|
||||
}
|
||||
break;
|
||||
case eBlendMode.PreMultipliedAlpha:
|
||||
case eBlendMode.StandardAlpha:
|
||||
default:
|
||||
{
|
||||
bool zWrite = material.GetFloat("_ZWrite") > 0.0f;
|
||||
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
|
||||
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
|
||||
material.SetOverrideTag("RenderType", zWrite ? "TransparentCutout" : "Transparent");
|
||||
renderQueue = zWrite ? kAlphaTestQueue : kTransparentQueue;
|
||||
SetRenderQueue(material, zWrite ? "TransparentCutout" : "Transparent");
|
||||
renderQueue = zWrite ? AlphaTestQueue : TransparentQueue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -459,16 +535,16 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
|
||||
switch (_lightMode) {
|
||||
case eLightMode.VertexLit:
|
||||
if (material.shader.name != kShaderVertexLit)
|
||||
_materialEditor.SetShader(Shader.Find(kShaderVertexLit), false);
|
||||
if (material.shader.name != ShaderVertexLit)
|
||||
_materialEditor.SetShader(Shader.Find(ShaderVertexLit), false);
|
||||
break;
|
||||
case eLightMode.PixelLit:
|
||||
if (material.shader.name != kShaderPixelLit)
|
||||
_materialEditor.SetShader(Shader.Find(kShaderPixelLit), false);
|
||||
if (material.shader.name != ShaderPixelLit)
|
||||
_materialEditor.SetShader(Shader.Find(ShaderPixelLit), false);
|
||||
break;
|
||||
case eLightMode.Unlit:
|
||||
if (material.shader.name != kShaderUnlit)
|
||||
_materialEditor.SetShader(Shader.Find(kShaderUnlit), false);
|
||||
if (material.shader.name != ShaderUnlit)
|
||||
_materialEditor.SetShader(Shader.Find(ShaderUnlit), false);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -476,13 +552,5 @@ public class SpineSpriteShaderGUI : ShaderGUI {
|
||||
}
|
||||
}
|
||||
|
||||
void BlendModePopup () {
|
||||
eBlendMode mode = (eBlendMode)_blendMode.floatValue;
|
||||
EditorGUI.BeginChangeCheck();
|
||||
mode = (eBlendMode)EditorGUILayout.Popup("Blend Mode", (int)mode, Enum.GetNames(typeof(eBlendMode)));
|
||||
if (EditorGUI.EndChangeCheck()) {
|
||||
_materialEditor.RegisterPropertyChangeUndo("Blend Mode");
|
||||
_blendMode.floatValue = (float)mode;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,446 @@
|
||||
Shader "Hidden/Internal-SpriteDepthNormalsTexture" {
|
||||
|
||||
// Use this shader to render a DepthNormals texture for a camera with correct sprite normals (using camera.RenderWithShader)
|
||||
|
||||
Properties {
|
||||
_MainTex ("", 2D) = "white" {}
|
||||
_Cutoff ("", Float) = 0.5
|
||||
_Color ("", Color) = (1,1,1,1)
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="Sprite" }
|
||||
Pass {
|
||||
Cull Off
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
uniform float4 _MainTex_ST;
|
||||
uniform float4 _FixedNormal;
|
||||
v2f vert( appdata_base v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
o.nz.xyz = _FixedNormal.xyz;
|
||||
#if UNITY_REVERSED_Z
|
||||
o.nz.z = -o.nz.z;
|
||||
#endif
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
uniform fixed4 _Color;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
clip( texcol.a*_Color.a - _Cutoff );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="Opaque" }
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float4 nz : TEXCOORD0;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
v2f vert( appdata_base v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TransparentCutout" }
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
uniform float4 _MainTex_ST;
|
||||
v2f vert( appdata_base v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
uniform fixed4 _Color;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
clip( texcol.a*_Color.a - _Cutoff );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TreeBark" }
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "Lighting.cginc"
|
||||
#include "UnityBuiltin3xTreeLibrary.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
v2f vert( appdata_full v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TreeVertBark(v);
|
||||
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
fixed4 frag( v2f i ) : SV_Target {
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TreeLeaf" }
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "Lighting.cginc"
|
||||
#include "UnityBuiltin3xTreeLibrary.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
v2f vert( appdata_full v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TreeVertLeaf(v);
|
||||
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
fixed4 frag( v2f i ) : SV_Target {
|
||||
half alpha = tex2D(_MainTex, i.uv).a;
|
||||
|
||||
clip (alpha - _Cutoff);
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TreeOpaque" "DisableBatching"="True" }
|
||||
Pass {
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float4 nz : TEXCOORD0;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
struct appdata {
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
fixed4 color : COLOR;
|
||||
UNITY_INSTANCE_ID
|
||||
};
|
||||
v2f vert( appdata v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TerrainAnimateTree(v.vertex, v.color.w);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TreeTransparentCutout" "DisableBatching"="True" }
|
||||
Pass {
|
||||
Cull Back
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
struct appdata {
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
fixed4 color : COLOR;
|
||||
float4 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
v2f vert( appdata v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TerrainAnimateTree(v.vertex, v.color.w);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
half alpha = tex2D(_MainTex, i.uv).a;
|
||||
|
||||
clip (alpha - _Cutoff);
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
Pass {
|
||||
Cull Front
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
struct appdata {
|
||||
float4 vertex : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
fixed4 color : COLOR;
|
||||
float4 texcoord : TEXCOORD0;
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
v2f vert( appdata v ) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TerrainAnimateTree(v.vertex, v.color.w);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.nz.xyz = -COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
clip( texcol.a - _Cutoff );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="TreeBillboard" }
|
||||
Pass {
|
||||
Cull Off
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
v2f vert (appdata_tree_billboard v) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
TerrainBillboardTree(v.vertex, v.texcoord1.xy, v.texcoord.y);
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv.x = v.texcoord.x;
|
||||
o.uv.y = v.texcoord.y > 0;
|
||||
o.nz.xyz = float3(0,0,1);
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
clip( texcol.a - 0.001 );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="GrassBillboard" }
|
||||
Pass {
|
||||
Cull Off
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
fixed4 color : COLOR;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata_full v) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
WavingGrassBillboardVert (v);
|
||||
o.color = v.color;
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord.xy;
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
fixed alpha = texcol.a * i.color.a;
|
||||
clip( alpha - _Cutoff );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
SubShader {
|
||||
Tags { "RenderType"="Grass" }
|
||||
Pass {
|
||||
Cull Off
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
#include "UnityCG.cginc"
|
||||
#include "TerrainEngine.cginc"
|
||||
struct v2f {
|
||||
float4 pos : SV_POSITION;
|
||||
fixed4 color : COLOR;
|
||||
float2 uv : TEXCOORD0;
|
||||
float4 nz : TEXCOORD1;
|
||||
UNITY_VERTEX_OUTPUT_STEREO
|
||||
};
|
||||
|
||||
v2f vert (appdata_full v) {
|
||||
v2f o;
|
||||
UNITY_SETUP_INSTANCE_ID(v);
|
||||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
|
||||
WavingGrassVert (v);
|
||||
o.color = v.color;
|
||||
o.pos = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = v.texcoord;
|
||||
o.nz.xyz = COMPUTE_VIEW_NORMAL;
|
||||
o.nz.w = COMPUTE_DEPTH_01;
|
||||
return o;
|
||||
}
|
||||
uniform sampler2D _MainTex;
|
||||
uniform fixed _Cutoff;
|
||||
fixed4 frag(v2f i) : SV_Target {
|
||||
fixed4 texcol = tex2D( _MainTex, i.uv );
|
||||
fixed alpha = texcol.a * i.color.a;
|
||||
clip( alpha - _Cutoff );
|
||||
return EncodeDepthNormal (i.nz.w, i.nz.xyz);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
|
||||
Fallback Off
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abbda12fddbb0b048a842a3835470d30
|
||||
timeCreated: 1480325971
|
||||
licenseType: Free
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -1,5 +1,3 @@
|
||||
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
|
||||
|
||||
#ifndef SPRITE_LIGHTING_INCLUDED
|
||||
#define SPRITE_LIGHTING_INCLUDED
|
||||
|
||||
|
||||
@ -9,9 +9,6 @@
|
||||
// Defines
|
||||
//
|
||||
|
||||
//Define to use spherical harmonics for ambient lighting
|
||||
#define TRI_COLOR_AMBIENT
|
||||
|
||||
////////////////////////////////////////
|
||||
// Vertex output struct
|
||||
//
|
||||
@ -94,7 +91,7 @@ fixed3 calculateVertexLighting(float3 posWorld, float3 normalWorld)
|
||||
|
||||
fixed3 calculateAmbientLight(half3 normalWorld)
|
||||
{
|
||||
#if defined(TRI_COLOR_AMBIENT)
|
||||
#if defined(_SPHERICAL_HARMONICS)
|
||||
fixed3 ambient = ShadeSH9(half4(normalWorld, 1.0)) * 0.75f;
|
||||
#else
|
||||
fixed3 ambient = unity_AmbientSky.rgb * 0.75;
|
||||
|
||||
@ -9,8 +9,8 @@
|
||||
// Defines
|
||||
//
|
||||
|
||||
//Define to use fake spherical harmonics for ambient lighting
|
||||
#define TRI_COLOR_AMBIENT
|
||||
//Define to use spot lights (more expensive)
|
||||
#define SPOT_LIGHTS
|
||||
|
||||
//Have to process lighting per pixel if using normal maps or a diffuse ramp or rim lighting
|
||||
#if defined(_NORMALMAP) || defined(_DIFFUSE_RAMP) || defined(_RIM_LIGHTING)
|
||||
@ -126,7 +126,7 @@ struct VertexLightInfo
|
||||
fixed3 lightColor;
|
||||
|
||||
#if defined(_DIFFUSE_RAMP)
|
||||
float attenuation;
|
||||
float attenuationSqrt;
|
||||
#endif // _DIFFUSE_RAMP
|
||||
};
|
||||
|
||||
@ -135,24 +135,29 @@ inline VertexLightInfo getVertexLightAttenuatedInfo(int index, float3 viewPos)
|
||||
VertexLightInfo lightInfo;
|
||||
|
||||
//For directional lights _WorldSpaceLightPos0.w is set to zero
|
||||
lightInfo.lightDirection = unity_LightPosition[index].xyz - (viewPos.xyz * unity_LightPosition[index].w);
|
||||
lightInfo.lightDirection = unity_LightPosition[index].xyz - viewPos.xyz * unity_LightPosition[index].w;
|
||||
float lengthSq = dot(lightInfo.lightDirection, lightInfo.lightDirection);
|
||||
|
||||
// don't produce NaNs if some vertex position overlaps with the light
|
||||
lengthSq = max(lengthSq, 0.000001);
|
||||
|
||||
lightInfo.lightDirection *= rsqrt(lengthSq);
|
||||
|
||||
float attenuation = 1.0 / (1.0 + lengthSq * unity_LightAtten[index].z);
|
||||
float attenuation = 1.0 / (1.0 + lengthSq * unity_LightAtten[index].z);
|
||||
|
||||
#if defined(SPOT_LIGHTS)
|
||||
//Spot light attenuation - for non-spot lights unity_LightAtten.x is set to -1 and y is set to 1
|
||||
if (-1 != unity_LightAtten[index].x || 1 != unity_LightAtten[index].y)
|
||||
{
|
||||
float rho = dotClamped(lightInfo.lightDirection, unity_SpotDirection[index].xyz);
|
||||
{
|
||||
float rho = max (0, dot(lightInfo.lightDirection, unity_SpotDirection[index].xyz));
|
||||
float spotAtt = (rho - unity_LightAtten[index].x) * unity_LightAtten[index].y;
|
||||
attenuation *= saturate(spotAtt);
|
||||
}
|
||||
|
||||
#endif // SPOT_LIGHTS
|
||||
|
||||
//If using a diffuse ramp texture then need to pass through the lights attenuation, otherwise premultiply the light color with it
|
||||
#if defined(_DIFFUSE_RAMP)
|
||||
lightInfo.lightColor = unity_LightColor[index].rgb;
|
||||
lightInfo.attenuation = sqrt(attenuation);
|
||||
lightInfo.attenuationSqrt = sqrt(attenuation);
|
||||
#else
|
||||
lightInfo.lightColor = unity_LightColor[index].rgb * attenuation;
|
||||
#endif // _DIFFUSE_RAMP
|
||||
@ -162,13 +167,13 @@ inline VertexLightInfo getVertexLightAttenuatedInfo(int index, float3 viewPos)
|
||||
|
||||
fixed3 calculateAmbientLight(half3 normalWorld)
|
||||
{
|
||||
#if defined(TRI_COLOR_AMBIENT)
|
||||
#if defined(_SPHERICAL_HARMONICS)
|
||||
|
||||
//Magic constants used to tweak ambient to approximate pixel shader spherical harmonics
|
||||
fixed3 worldUp = fixed3(0,1,0);
|
||||
float skyGroundDotMul = 2.5;
|
||||
float minEquatorMix = 0.5;
|
||||
float equatorColorBlur = 0.33;
|
||||
static const fixed3 worldUp = fixed3(0,1,0);
|
||||
static const float skyGroundDotMul = 2.5;
|
||||
static const float minEquatorMix = 0.5;
|
||||
static const float equatorColorBlur = 0.33;
|
||||
|
||||
float upDot = dot(normalWorld, worldUp);
|
||||
|
||||
@ -191,13 +196,12 @@ fixed3 calculateAmbientLight(half3 normalWorld)
|
||||
//Mix the two colors together based on how bright the equator light is
|
||||
return lerp(skyGroundColor, equatorColor, saturate(equatorBright + minEquatorMix)) * 0.75;
|
||||
|
||||
#else
|
||||
#else // !_SPHERICAL_HARMONICS
|
||||
|
||||
//Flat ambient is just the sky color
|
||||
return unity_AmbientSky.rgb * 0.75;
|
||||
|
||||
#endif // TRI_COLOR_AMBIENT
|
||||
|
||||
#endif // !_SPHERICAL_HARMONICS
|
||||
}
|
||||
|
||||
////////////////////////////////////////
|
||||
@ -208,18 +212,18 @@ fixed3 calculateAmbientLight(half3 normalWorld)
|
||||
|
||||
inline fixed3 calculateLightDiffuse(fixed3 lightColor, half3 normal, half3 lightDirection, float attenuation)
|
||||
{
|
||||
float angleDot = dotClamped(normal, lightDirection);
|
||||
float angleDot = max(0, dot(normal, lightDirection));
|
||||
fixed3 diffuse = calculateRampedDiffuse(lightColor, attenuation, angleDot);
|
||||
return diffuse * 0.75;
|
||||
return diffuse;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
inline fixed3 calculateLightDiffuse(fixed3 attenuatedLightColor, half3 normal, half3 lightDirection)
|
||||
{
|
||||
float angleDot = dotClamped(normal, lightDirection);
|
||||
float angleDot = max(0, dot(normal, lightDirection));
|
||||
fixed3 diffuse = attenuatedLightColor * angleDot;
|
||||
return diffuse * 0.75;
|
||||
return diffuse;
|
||||
}
|
||||
|
||||
#endif // _NORMALMAP
|
||||
@ -273,7 +277,7 @@ inline VertexLightInfo getVertexLightAttenuatedInfoWorldSpace(int index, float3
|
||||
|
||||
#define PACK_VERTEX_LIGHT_DIFFUSE(index, output, lightInfo) \
|
||||
{ \
|
||||
output.LIGHT_DIFFUSE_ATTEN_##index = lightInfo.attenuation; \
|
||||
output.LIGHT_DIFFUSE_ATTEN_##index = lightInfo.attenuationSqrt; \
|
||||
}
|
||||
|
||||
#define ADD_VERTEX_LIGHT_DIFFUSE(index, diffuse, input, vertexLightColor, normalDirection, vertexLightDir) \
|
||||
@ -314,10 +318,8 @@ inline VertexLightInfo getVertexLightAttenuatedInfoWorldSpace(int index, float3
|
||||
inline fixed3 calculateLightDiffuse(int index, float3 viewPos, half3 viewNormal)
|
||||
{
|
||||
VertexLightInfo lightInfo = getVertexLightAttenuatedInfo(index, viewPos);
|
||||
float angleDot = dotClamped(viewNormal, lightInfo.lightDirection);
|
||||
|
||||
fixed3 diffuse = lightInfo.lightColor * angleDot;
|
||||
return diffuse;
|
||||
float diff = max (0, dot (viewNormal, lightInfo.lightDirection));
|
||||
return lightInfo.lightColor * diff;
|
||||
}
|
||||
|
||||
#endif // !PER_PIXEL_LIGHTING
|
||||
@ -368,7 +370,7 @@ VertexOutput vert(VertexInput input)
|
||||
diffuse += calculateLightDiffuse(2, viewPos, viewNormal);
|
||||
diffuse += calculateLightDiffuse(3, viewPos, viewNormal);
|
||||
|
||||
output.FullLighting = saturate(ambient + diffuse);
|
||||
output.FullLighting = ambient + diffuse;
|
||||
|
||||
#endif // !PER_PIXEL_LIGHTING
|
||||
|
||||
@ -408,7 +410,7 @@ fixed4 frag(VertexOutput input) : SV_Target
|
||||
ADD_VERTEX_LIGHT(2, input, normalWorld, diffuse)
|
||||
ADD_VERTEX_LIGHT(3, input, normalWorld, diffuse)
|
||||
|
||||
fixed3 lighting = saturate(ambient + diffuse);
|
||||
fixed3 lighting = ambient + diffuse;
|
||||
|
||||
APPLY_EMISSION(lighting, input.texcoord.xy)
|
||||
|
||||
|
||||
@ -27,8 +27,7 @@ Shader "Spine/Sprite/Pixel Lit"
|
||||
|
||||
_BlendTex ("Blend Texture", 2D) = "white" {}
|
||||
_BlendAmount ("Blend", Range(0,1)) = 0.0
|
||||
|
||||
[HideInInspector] _BlendMode ("__mode", Float) = 0.0
|
||||
|
||||
[HideInInspector] _SrcBlend ("__src", Float) = 1.0
|
||||
[HideInInspector] _DstBlend ("__dst", Float) = 0.0
|
||||
[HideInInspector] _RenderQueue ("__queue", Float) = 0.0
|
||||
@ -37,7 +36,7 @@ Shader "Spine/Sprite/Pixel Lit"
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
|
||||
Tags { "Queue"="Transparent" "RenderType"="Sprite" }
|
||||
LOD 200
|
||||
|
||||
Pass
|
||||
@ -61,10 +60,11 @@ Shader "Spine/Sprite/Pixel Lit"
|
||||
#pragma shader_feature _DIFFUSE_RAMP
|
||||
#pragma shader_feature _COLOR_ADJUST
|
||||
#pragma shader_feature _TEXTURE_BLEND
|
||||
#pragma shader_feature _SPHERICAL_HARMONICS
|
||||
#pragma shader_feature _FOG
|
||||
|
||||
#pragma multi_compile_fwdbase
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
#pragma multi_compile_fog
|
||||
|
||||
#pragma vertex vert
|
||||
|
||||
@ -16,8 +16,7 @@ Shader "Spine/Sprite/Unlit"
|
||||
|
||||
_BlendTex ("Blend Texture", 2D) = "white" {}
|
||||
_BlendAmount ("Blend", Range(0,1)) = 0.0
|
||||
|
||||
[HideInInspector] _BlendMode ("__mode", Float) = 0.0
|
||||
|
||||
[HideInInspector] _SrcBlend ("__src", Float) = 1.0
|
||||
[HideInInspector] _DstBlend ("__dst", Float) = 0.0
|
||||
[HideInInspector] _RenderQueue ("__queue", Float) = 0.0
|
||||
@ -26,7 +25,7 @@ Shader "Spine/Sprite/Unlit"
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
|
||||
Tags { "Queue"="Transparent" "RenderType"="Sprite" }
|
||||
LOD 100
|
||||
|
||||
Pass
|
||||
|
||||
@ -27,8 +27,7 @@ Shader "Spine/Sprite/Vertex Lit"
|
||||
|
||||
_BlendTex ("Blend Texture", 2D) = "white" {}
|
||||
_BlendAmount ("Blend", Range(0,1)) = 0.0
|
||||
|
||||
[HideInInspector] _BlendMode ("__mode", Float) = 0.0
|
||||
|
||||
[HideInInspector] _SrcBlend ("__src", Float) = 1.0
|
||||
[HideInInspector] _DstBlend ("__dst", Float) = 0.0
|
||||
[HideInInspector] _RenderQueue ("__queue", Float) = 0.0
|
||||
@ -37,7 +36,7 @@ Shader "Spine/Sprite/Vertex Lit"
|
||||
|
||||
SubShader
|
||||
{
|
||||
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
|
||||
Tags { "Queue"="Transparent" "RenderType"="Sprite" }
|
||||
LOD 150
|
||||
|
||||
Pass
|
||||
@ -62,6 +61,7 @@ Shader "Spine/Sprite/Vertex Lit"
|
||||
#pragma shader_feature _COLOR_ADJUST
|
||||
#pragma shader_feature _RIM_LIGHTING
|
||||
#pragma shader_feature _TEXTURE_BLEND
|
||||
#pragma shader_feature _SPHERICAL_HARMONICS
|
||||
#pragma shader_feature _FOG
|
||||
|
||||
#pragma fragmentoption ARB_precision_hint_fastest
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user