mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
更新Demo
更新Demo
This commit is contained in:
308
UnityProject/Assets/AssetArt/Shader/StandardMobile.cginc
Normal file
308
UnityProject/Assets/AssetArt/Shader/StandardMobile.cginc
Normal file
@@ -0,0 +1,308 @@
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
// DEFINES, CONSTRUCTORS AND STRUCTS
|
||||
|
||||
sampler2D _MainTex;
|
||||
half4 _MainTex_ST;
|
||||
|
||||
// Color, brightness and contrast
|
||||
#if COLOR_ON
|
||||
half4 _Color;
|
||||
half _Brightness;
|
||||
half _Contrast;
|
||||
#endif
|
||||
|
||||
// Phong point light
|
||||
#if PHONG_ON
|
||||
uniform half4 _PointLightColor;
|
||||
uniform half3 _PointLightPosition;
|
||||
|
||||
half _AmbiencePower;
|
||||
half _SpecularPower;
|
||||
half _DiffusePower;
|
||||
#endif
|
||||
|
||||
// Detail map
|
||||
#if DETAIL_ON
|
||||
sampler2D _DetailMap;
|
||||
half _DetailStrength;
|
||||
#endif
|
||||
|
||||
// Detail mask
|
||||
#if DETAIL_ON && DETAIL_MASK_ON
|
||||
sampler2D _DetailMask;
|
||||
#endif
|
||||
|
||||
// Emission map
|
||||
#if EMISSION_ON
|
||||
sampler2D _EmissionMap;
|
||||
half _EmissionStrength;
|
||||
#endif
|
||||
|
||||
// Normal map
|
||||
#if NORMAL_ON
|
||||
sampler2D _NormalMap;
|
||||
#endif
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
half2 texcoord : TEXCOORD0;
|
||||
#if PHONG_ON
|
||||
float4 normal : NORMAL;
|
||||
#endif
|
||||
#if NORMAL_ON
|
||||
float4 tangent : TANGENT;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct appdata_lm
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
half2 texcoord : TEXCOORD0;
|
||||
half2 texcoord_lm : TEXCOORD1;
|
||||
#if PHONG_ON
|
||||
float4 normal : NORMAL;
|
||||
#endif
|
||||
#if NORMAL_ON
|
||||
float4 tangent : TANGENT;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float4 vertex : SV_POSITION;
|
||||
half2 uv_main : TEXCOORD0;
|
||||
UNITY_FOG_COORDS(1)
|
||||
#if PHONG_ON
|
||||
float4 worldVertex : TEXCOORD2; // worldPos
|
||||
#endif
|
||||
#if PHONG_ON || NORMAL_ON
|
||||
half3 worldNormal : TEXCOORD3;
|
||||
#endif
|
||||
#if NORMAL_ON
|
||||
// these three vectors will hold a 3x3 rotation matrix
|
||||
// that transforms from tangent to world space
|
||||
half3 tspace0 : TEXCOORD4; // tangent.x, bitangent.x, normal.x
|
||||
half3 tspace1 : TEXCOORD5; // tangent.y, bitangent.y, normal.y
|
||||
half3 tspace2 : TEXCOORD6; // tangent.z, bitangent.z, normal.z
|
||||
#endif
|
||||
};
|
||||
|
||||
struct v2f_lm
|
||||
{
|
||||
float4 vertex : SV_POSITION;
|
||||
half2 uv_main : TEXCOORD0;
|
||||
half2 uv_lm : TEXCOORD1;
|
||||
UNITY_FOG_COORDS(2)
|
||||
#if PHONG_ON
|
||||
float4 worldVertex : TEXCOORD3;
|
||||
#endif
|
||||
#if PHONG_ON || NORMAL_ON
|
||||
half3 worldNormal : TEXCOORD4;
|
||||
#endif
|
||||
#if NORMAL_ON
|
||||
// these three vectors will hold a 3x3 rotation matrix
|
||||
// that transforms from tangent to world space
|
||||
half3 tspace0 : TEXCOORD5; // tangent.x, bitangent.x, normal.x
|
||||
half3 tspace1 : TEXCOORD6; // tangent.y, bitangent.y, normal.y
|
||||
half3 tspace2 : TEXCOORD7; // tangent.z, bitangent.z, normal.z
|
||||
#endif
|
||||
};
|
||||
|
||||
// VERTEX SHADERS
|
||||
|
||||
v2f vert(appdata v)
|
||||
{
|
||||
v2f o;
|
||||
o.vertex = UnityObjectToClipPos(v.vertex);
|
||||
|
||||
#if PHONG_ON
|
||||
o.worldVertex = mul(unity_ObjectToWorld, v.vertex);
|
||||
o.worldNormal = UnityObjectToWorldNormal(v.normal);
|
||||
#endif
|
||||
|
||||
#if NORMAL_ON
|
||||
half3 wTangent = UnityObjectToWorldDir(v.tangent.xyz);
|
||||
// compute bitangent from cross product of normal and tangent
|
||||
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
|
||||
half3 wBitangent = cross(o.worldNormal, wTangent) * tangentSign;
|
||||
// output the tangent space matrix
|
||||
o.tspace0 = half3(wTangent.x, wBitangent.x, o.worldNormal.x);
|
||||
o.tspace1 = half3(wTangent.y, wBitangent.y, o.worldNormal.y);
|
||||
o.tspace2 = half3(wTangent.z, wBitangent.z, o.worldNormal.z);
|
||||
#endif
|
||||
|
||||
o.uv_main = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
UNITY_TRANSFER_FOG(o, o.vertex);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
v2f_lm vert_lm(appdata_lm v)
|
||||
{
|
||||
v2f_lm o;
|
||||
o.vertex = UnityObjectToClipPos(v.vertex); // XXX: Is this efficient?
|
||||
|
||||
#if PHONG_ON
|
||||
o.worldVertex = mul(unity_ObjectToWorld, v.vertex);
|
||||
o.worldNormal = UnityObjectToWorldNormal(v.normal);
|
||||
#endif
|
||||
|
||||
#if NORMAL_ON && PHONG_ON
|
||||
half3 wTangent = UnityObjectToWorldDir(v.tangent.xyz);
|
||||
// compute bitangent from cross product of normal and tangent
|
||||
half tangentSign = v.tangent.w * unity_WorldTransformParams.w;
|
||||
half3 wBitangent = cross(o.worldNormal, wTangent) * tangentSign;
|
||||
// output the tangent space matrix
|
||||
o.tspace0 = half3(wTangent.x, wBitangent.x, o.worldNormal.x);
|
||||
o.tspace1 = half3(wTangent.y, wBitangent.y, o.worldNormal.y);
|
||||
o.tspace2 = half3(wTangent.z, wBitangent.z, o.worldNormal.z);
|
||||
#endif
|
||||
|
||||
o.uv_main = TRANSFORM_TEX(v.texcoord, _MainTex);
|
||||
// lightmapped uv
|
||||
o.uv_lm = v.texcoord_lm.xy * unity_LightmapST.xy + unity_LightmapST.zw;
|
||||
UNITY_TRANSFER_FOG(o, o.vertex);
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
// FRAGMENT SHADERS
|
||||
|
||||
#if COLOR_ON
|
||||
// Fix the brightness, contrast and color
|
||||
half4 bcc(half4 main_color)
|
||||
{
|
||||
main_color.rgb /= main_color.a;
|
||||
main_color.rgb = ((main_color.rgb - 0.5f) * max(_Contrast, 0)) + 0.5f;
|
||||
main_color.rgb += _Brightness * 0.05;
|
||||
main_color.rgb *= main_color.a;
|
||||
|
||||
//main_color.rgb = lerp(main_color.rgb, _Color.rgb, _Color.a);
|
||||
main_color *= _Color;
|
||||
|
||||
return main_color;
|
||||
}
|
||||
#endif
|
||||
|
||||
fixed4 frag(v2f i) : SV_Target
|
||||
{
|
||||
half4 returnColor = tex2D(_MainTex, i.uv_main);
|
||||
|
||||
#if DETAIL_ON
|
||||
half4 mask = half4(1, 1, 1, 1);
|
||||
#endif
|
||||
#if DETAIL_ON && DETAIL_MASK_ON
|
||||
mask = tex2D(_DetailMask, i.uv_main);
|
||||
#endif
|
||||
#if DETAIL_ON
|
||||
half4 detailMap = tex2D(_DetailMap, i.uv_main) * mask;
|
||||
const fixed3 constantList = fixed3(1.0, 0.5, 0.0);
|
||||
returnColor = (returnColor + _DetailStrength*detailMap) * constantList.xxxz + (returnColor + _DetailStrength*detailMap) * constantList.zzzy;
|
||||
#endif
|
||||
|
||||
#if EMISSION_ON
|
||||
returnColor += tex2D(_EmissionMap, i.uv_main)*_EmissionStrength*0.2;
|
||||
#endif
|
||||
|
||||
#if NORMAL_ON
|
||||
// sample the normal map, and decode from the Unity encoding
|
||||
half3 tnormal = UnpackNormal(tex2D(_NormalMap, i.uv_main));
|
||||
// transform normal from tangent to world space
|
||||
half3 worldNormal;
|
||||
worldNormal.x = dot(i.tspace0, tnormal);
|
||||
worldNormal.y = dot(i.tspace1, tnormal);
|
||||
worldNormal.z = dot(i.tspace2, tnormal);
|
||||
float3 normal = normalize(worldNormal);
|
||||
#endif
|
||||
#if !NORMAL_ON && PHONG_ON
|
||||
float3 normal = normalize(i.worldNormal.xyz);
|
||||
#endif
|
||||
|
||||
#if PHONG_ON
|
||||
float3 localCoords = i.worldVertex.xyz;
|
||||
// ambient intensities
|
||||
half3 amb = returnColor.rgb * unity_AmbientSky * _AmbiencePower;
|
||||
// diffuse intensities
|
||||
half3 L = normalize(_PointLightPosition - localCoords);
|
||||
half LdotN = dot(L, normal);
|
||||
half3 dif = _PointLightColor.rgb * returnColor.rgb * saturate(LdotN) * _DiffusePower;
|
||||
// specular intensities
|
||||
half3 V = normalize(_WorldSpaceCameraPos - localCoords);
|
||||
half3 H = normalize(V+L);
|
||||
half3 spe = _PointLightColor.rgb * pow(saturate(dot(normal, H)), 25) * _SpecularPower;
|
||||
|
||||
returnColor.rgb = lerp(returnColor.rgb, amb.rgb+dif.rgb+spe.rgb, _PointLightColor.a);
|
||||
#endif
|
||||
|
||||
UNITY_APPLY_FOG(i.fogCoord, returnColor);
|
||||
|
||||
#if COLOR_ON
|
||||
returnColor = bcc(returnColor);
|
||||
#endif
|
||||
|
||||
return returnColor;
|
||||
}
|
||||
|
||||
fixed4 frag_lm(v2f_lm i) : SV_Target
|
||||
{
|
||||
half4 returnColor = tex2D(_MainTex, i.uv_main);
|
||||
|
||||
#if DETAIL_ON
|
||||
half4 mask = half4(1, 1, 1, 1);
|
||||
#endif
|
||||
#if DETAIL_ON && DETAIL_MASK_ON
|
||||
mask = tex2D(_DetailMask, i.uv_main);
|
||||
#endif
|
||||
#if DETAIL_ON
|
||||
half4 detailMap = tex2D(_DetailMap, i.uv_main) * mask;
|
||||
const fixed3 constantList = fixed3(1.0, 0.5, 0.0);
|
||||
returnColor = (returnColor + _DetailStrength*detailMap) * constantList.xxxz + (returnColor + _DetailStrength*detailMap) * constantList.zzzy;
|
||||
#endif
|
||||
|
||||
#if EMISSION_ON
|
||||
returnColor += tex2D(_EmissionMap, i.uv_main)*_EmissionStrength/5;
|
||||
#endif
|
||||
returnColor.rgb *= DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv_lm));
|
||||
|
||||
#if NORMAL_ON
|
||||
// sample the normal map, and decode from the Unity encoding
|
||||
half3 tnormal = UnpackNormal(tex2D(_NormalMap, i.uv_main));
|
||||
// transform normal from tangent to world space
|
||||
half3 worldNormal;
|
||||
worldNormal.x = dot(i.tspace0, tnormal);
|
||||
worldNormal.y = dot(i.tspace1, tnormal);
|
||||
worldNormal.z = dot(i.tspace2, tnormal);
|
||||
float3 normal = normalize(worldNormal);
|
||||
#endif
|
||||
#if !NORMAL_ON && PHONG_ON
|
||||
float3 normal = normalize(i.worldNormal.xyz);
|
||||
#endif
|
||||
|
||||
#if PHONG_ON
|
||||
float3 localCoords = i.worldVertex.xyz;
|
||||
// ambient intensities
|
||||
half3 amb = returnColor.rgb * unity_AmbientSky * _AmbiencePower;
|
||||
// diffuse intensities
|
||||
half3 L = normalize(_PointLightPosition - localCoords);
|
||||
half LdotN = dot(L, normal);
|
||||
half3 dif = _PointLightColor.rgb * returnColor.rgb * saturate(LdotN) * _DiffusePower;
|
||||
// specular intensities
|
||||
half3 V = normalize(_WorldSpaceCameraPos - localCoords);
|
||||
half3 H = normalize(V+L);
|
||||
half3 spe = _PointLightColor.rgb * pow(saturate(dot(normal, H)), 25) * _SpecularPower;
|
||||
|
||||
returnColor.rgb = lerp(returnColor.rgb, amb.rgb+dif.rgb+spe.rgb, _PointLightColor.a);
|
||||
#endif
|
||||
|
||||
UNITY_APPLY_FOG(i.fogCoord, returnColor);
|
||||
|
||||
#if COLOR_ON
|
||||
returnColor = bcc(returnColor);
|
||||
#endif
|
||||
|
||||
return returnColor;
|
||||
}
|
||||
|
||||
// SURFACE SHADERS
|
Reference in New Issue
Block a user