type shit
This commit is contained in:
@@ -0,0 +1,409 @@
|
||||
// Upgrade NOTE: upgraded instancing buffer 'MyProperties' to new syntax.
|
||||
|
||||
Shader "UVFree/StandardMetallic/Single-Texture Non-Batched" {
|
||||
Properties {
|
||||
// Triplanar space, for UI
|
||||
[HideInInspector] _TriplanarSpace("Triplanar Space", Float) = 0.0
|
||||
|
||||
_TexPower("Texture Power", Range(0.0, 20.0)) = 10.0
|
||||
|
||||
_Color ("Color", Color) = (1.0,1.0,1.0,1.0)
|
||||
_MainTex ("Albedo (RGB)", 2D) = "white" {}
|
||||
|
||||
_VertexColorStrength("Vertex Color Strength", Range(0.0,1.0)) = 1.0
|
||||
|
||||
_Glossiness ("Smoothness", Range(0.0,1.0)) = 0.5
|
||||
|
||||
[Gamma] _Metallic ("Metallic", Range(0.0,1.0)) = 0.0
|
||||
_MetallicGlossMap("Metallic", 2D) = "black" {}
|
||||
_UsingMetallicGlossMap("Using Metallic Gloss Map", float) = 0.0
|
||||
[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
|
||||
[ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0
|
||||
|
||||
_BumpScale("Bump Scale", Float) = 1.0
|
||||
_BumpMap("Normal Map", 2D) = "bump" {}
|
||||
|
||||
_Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
|
||||
_ParallaxMap ("Height Map", 2D) = "black" {}
|
||||
|
||||
_OcclusionStrength("Occlusion Strength", Range(0.0, 1.0)) = 1.0
|
||||
_OcclusionMap("Occlusion", 2D) = "white" {}
|
||||
|
||||
_EmissionColor("Emission Color", Color) = (0.0,0.0,0.0)
|
||||
_EmissionMap("Emission", 2D) = "white" {}
|
||||
|
||||
_DetailMask("Detail Mask", 2D) = "white" {}
|
||||
|
||||
_DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
|
||||
_DetailNormalMapScale("Scale", Float) = 1.0
|
||||
_DetailNormalMap("Normal Map", 2D) = "bump" {}
|
||||
|
||||
// UI-only data
|
||||
[HideInInspector] _EmissionScaleUI("Scale", Float) = 0.0
|
||||
[HideInInspector] _EmissionColorUI("Color", Color) = (1.0,1.0,1.0)
|
||||
|
||||
}
|
||||
SubShader {
|
||||
Tags {
|
||||
"RenderType"="Opaque"
|
||||
"PerformanceChecks"="False"
|
||||
"DisableBatching"="True"
|
||||
}
|
||||
LOD 300
|
||||
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
|
||||
// Physically based Standard lighting model, and enable shadows on all light types
|
||||
#pragma surface surf Standard vertex:vert fullforwardshadows nodynlightmap
|
||||
#pragma shader_feature _UVFREE_LOCAL
|
||||
#pragma shader_feature _EMISSION
|
||||
#pragma shader_feature _METALLICGLOSSMAP
|
||||
#pragma shader_feature _DETAIL
|
||||
#pragma shader_feature _OCCLUSION
|
||||
#pragma shader_feature _PARALLAXMAP
|
||||
#pragma shader_feature _SPECULARHIGHLIGHTS_OFF
|
||||
#pragma shader_feature _GLOSSYREFLECTIONS_OFF
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
// Uncomment to enable experimental feature which flips
|
||||
// backward textures. Note: Causes some normals to be flipped.
|
||||
// #define _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
|
||||
// Comment out following line to omit vertex colors
|
||||
#define _UVFREE_VERTEX_COLOR
|
||||
|
||||
// Instanced Properties
|
||||
// https://docs.unity3d.com/Manual/GPUInstancing.html
|
||||
UNITY_INSTANCING_BUFFER_START (MyProperties)
|
||||
UNITY_DEFINE_INSTANCED_PROP(fixed4, _Color)
|
||||
#define _Color_arr MyProperties
|
||||
UNITY_INSTANCING_BUFFER_END(MyProperties)
|
||||
|
||||
// Non-instanced properties
|
||||
half _TexPower;
|
||||
sampler2D _MainTex;
|
||||
float4 _MainTex_ST;
|
||||
sampler2D _BumpMap;
|
||||
half _BumpScale;
|
||||
fixed _Metallic;
|
||||
fixed _Glossiness;
|
||||
|
||||
#ifdef _DETAIL
|
||||
sampler2D _DetailAlbedoMap;
|
||||
float4 _DetailAlbedoMap_ST;
|
||||
sampler2D _DetailMask;
|
||||
sampler2D _DetailNormalMap;
|
||||
half _DetailNormalMapScale;
|
||||
#endif
|
||||
|
||||
#ifdef _METALLICGLOSSMAP
|
||||
sampler2D _MetallicGlossMap;
|
||||
fixed _UsingMetallicGlossMap;
|
||||
#endif
|
||||
|
||||
#ifdef _OCCLUSION
|
||||
sampler2D _OcclusionMap;
|
||||
fixed _OcclusionStrength;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _PARALLAXMAP
|
||||
sampler2D _ParallaxMap;
|
||||
half _Parallax;
|
||||
#endif
|
||||
|
||||
#ifdef _EMISSION
|
||||
sampler2D _EmissionMap;
|
||||
half4 _EmissionColor;
|
||||
#endif
|
||||
|
||||
#ifdef _UVFREE_VERTEX_COLOR
|
||||
fixed _VertexColorStrength;
|
||||
#endif
|
||||
|
||||
struct Input {
|
||||
|
||||
fixed3 powerNormal;
|
||||
|
||||
#ifdef _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
fixed3 normal;
|
||||
#endif
|
||||
|
||||
float3 worldPos;
|
||||
fixed3 viewDirForParallax;
|
||||
|
||||
#ifdef _UVFREE_VERTEX_COLOR
|
||||
fixed4 color:COLOR;
|
||||
#endif
|
||||
|
||||
UNITY_VERTEX_INPUT_INSTANCE_ID
|
||||
};
|
||||
|
||||
|
||||
void vert (inout appdata_full v, out Input o) {
|
||||
|
||||
UNITY_INITIALIZE_OUTPUT(Input,o);
|
||||
|
||||
#ifdef _UVFREE_LOCAL
|
||||
#ifdef _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
o.normal = v.normal;
|
||||
#endif
|
||||
o.powerNormal = pow(abs(v.normal), _TexPower);
|
||||
o.powerNormal = max(o.powerNormal, 0.0001);
|
||||
o.powerNormal /= dot(o.powerNormal, 1.0);
|
||||
|
||||
v.tangent.xyz =
|
||||
cross(v.normal, fixed3(0.0,sign(v.normal.x),0.0)) * (o.powerNormal.x)
|
||||
+ cross(v.normal, fixed3(0.0,0.0,sign(v.normal.y))) * (o.powerNormal.y)
|
||||
+ cross(v.normal, fixed3(0.0,sign(v.normal.z),0.0)) * (o.powerNormal.z)
|
||||
;
|
||||
|
||||
v.tangent.w =
|
||||
(-(v.normal.x) * (o.powerNormal.x))
|
||||
+ (-(v.normal.y) * (o.powerNormal.y))
|
||||
+ (-(v.normal.z) * (o.powerNormal.z))
|
||||
;
|
||||
|
||||
#else
|
||||
fixed3 worldNormal = normalize(mul(unity_ObjectToWorld, fixed4(v.normal, 0.0)).xyz);
|
||||
|
||||
#ifdef _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
o.normal = worldNormal;
|
||||
#endif
|
||||
|
||||
o.powerNormal = pow(abs(worldNormal), _TexPower);
|
||||
o.powerNormal = max(o.powerNormal, 0.0001);
|
||||
o.powerNormal /= dot(o.powerNormal, 1.0);
|
||||
|
||||
v.tangent.xyz =
|
||||
cross(v.normal, mul(unity_WorldToObject,fixed4(0.0,sign(worldNormal.x),0.0,0.0)).xyz * (o.powerNormal.x))
|
||||
+ cross(v.normal, mul(unity_WorldToObject,fixed4(0.0,0.0,sign(worldNormal.y),0.0)).xyz * (o.powerNormal.y))
|
||||
+ cross(v.normal, mul(unity_WorldToObject,fixed4(0.0,sign(worldNormal.z),0.0,0.0)).xyz * (o.powerNormal.z))
|
||||
;
|
||||
|
||||
v.tangent.w =
|
||||
(-(worldNormal.x) * (o.powerNormal.x))
|
||||
+ (-(worldNormal.y) * (o.powerNormal.y))
|
||||
+ (-(worldNormal.z) * (o.powerNormal.z))
|
||||
;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _PARALLAXMAP
|
||||
TANGENT_SPACE_ROTATION;
|
||||
o.viewDirForParallax = mul (rotation, ObjSpaceViewDir(v.vertex));
|
||||
#endif
|
||||
}
|
||||
|
||||
void surf (Input IN, inout SurfaceOutputStandard o) {
|
||||
|
||||
// TRIPLANAR UVs BASED ON WORLD OR LOCAL POSITION
|
||||
//
|
||||
|
||||
#ifdef _UVFREE_LOCAL
|
||||
float3 pos = mul(unity_WorldToObject, float4(IN.worldPos, 1.0)).xyz;
|
||||
|
||||
float2 posX = pos.zy;
|
||||
float2 posY = pos.xz;
|
||||
float2 posZ = float2(-pos.x, pos.y);
|
||||
#else
|
||||
float3 pos = IN.worldPos;
|
||||
|
||||
float2 posX = IN.worldPos.zy;
|
||||
float2 posY = IN.worldPos.xz;
|
||||
float2 posZ = float2(-IN.worldPos.x, IN.worldPos.y);
|
||||
#endif
|
||||
|
||||
float2 xUV = posX * _MainTex_ST.xy + _MainTex_ST.zw;
|
||||
float2 yUV = posY * _MainTex_ST.xy + _MainTex_ST.zw;
|
||||
float2 zUV = posZ * _MainTex_ST.xy + _MainTex_ST.zw;
|
||||
|
||||
|
||||
#ifdef _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
fixed3 powerSign = sign(IN.normal);
|
||||
xUV.x *= powerSign.x;
|
||||
zUV.x *= powerSign.z;
|
||||
yUV.y *= powerSign.y;
|
||||
#endif
|
||||
|
||||
// PARALLAX
|
||||
//
|
||||
|
||||
#ifdef _PARALLAXMAP
|
||||
|
||||
half parallaxX = tex2D (_ParallaxMap, xUV).r;
|
||||
half parallaxY = tex2D (_ParallaxMap, yUV).g;
|
||||
half parallaxZ = tex2D (_ParallaxMap, zUV).b;
|
||||
|
||||
half parallax =
|
||||
parallaxX * IN.powerNormal.x
|
||||
+ parallaxY * IN.powerNormal.y
|
||||
+ parallaxZ * IN.powerNormal.z
|
||||
;
|
||||
float2 parallaxOffset = ParallaxOffset (parallax, _Parallax, IN.viewDirForParallax);
|
||||
xUV += parallaxOffset;
|
||||
yUV += parallaxOffset;
|
||||
zUV += parallaxOffset;
|
||||
|
||||
#endif
|
||||
|
||||
// DIFFUSE
|
||||
//
|
||||
|
||||
fixed4 texX = tex2D(_MainTex, xUV);
|
||||
fixed4 texY = tex2D(_MainTex, yUV);
|
||||
fixed4 texZ = tex2D(_MainTex, zUV);
|
||||
|
||||
fixed4 tex =
|
||||
texX * IN.powerNormal.x
|
||||
+ texY * IN.powerNormal.y
|
||||
+ texZ * IN.powerNormal.z;
|
||||
|
||||
#ifdef _UVFREE_VERTEX_COLOR
|
||||
tex *= lerp(fixed4(1.0,1.0,1.0,1.0), IN.color, _VertexColorStrength);
|
||||
#endif
|
||||
|
||||
fixed4 tint = UNITY_ACCESS_INSTANCED_PROP (_Color_arr, _Color);
|
||||
fixed3 albedo = max(fixed3(0.0, 0.0, 0.0), tex.rgb * tint.rgb);
|
||||
|
||||
|
||||
// DIFFUSE DETAIL
|
||||
//
|
||||
|
||||
#ifdef _DETAIL
|
||||
fixed detailMaskX = tex2D(_DetailMask, xUV).a;
|
||||
fixed detailMaskY = tex2D(_DetailMask, yUV).a;
|
||||
fixed detailMaskZ = tex2D(_DetailMask, zUV).a;
|
||||
|
||||
fixed detailMask =
|
||||
detailMaskX * IN.powerNormal.x
|
||||
+ detailMaskY * IN.powerNormal.y
|
||||
+ detailMaskZ * IN.powerNormal.z;
|
||||
|
||||
float2 xUVDetail = pos.zy * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
|
||||
float2 yUVDetail = pos.xz * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
|
||||
float2 zUVDetail = float2(-pos.x, pos.y) * _DetailAlbedoMap_ST.xy + _DetailAlbedoMap_ST.zw;
|
||||
|
||||
#ifdef _UVFREE_FLIP_BACKWARD_TEXTURES
|
||||
xUVDetail.x *= powerSign.x;
|
||||
zUVDetail.x *= powerSign.z;
|
||||
yUVDetail.y *= powerSign.y;
|
||||
#endif
|
||||
|
||||
#ifdef _PARALLAXMAP
|
||||
xUVDetail += parallaxOffset;
|
||||
yUVDetail += parallaxOffset;
|
||||
zUVDetail += parallaxOffset;
|
||||
#endif
|
||||
|
||||
fixed3 detailAlbedoX = tex2D (_DetailAlbedoMap, xUVDetail).rgb;
|
||||
fixed3 detailAlbedoY = tex2D (_DetailAlbedoMap, yUVDetail).rgb;
|
||||
fixed3 detailAlbedoZ = tex2D (_DetailAlbedoMap, zUVDetail).rgb;
|
||||
|
||||
fixed3 detailAlbedo =
|
||||
detailAlbedoX * IN.powerNormal.x
|
||||
+ detailAlbedoY * IN.powerNormal.y
|
||||
+ detailAlbedoZ * IN.powerNormal.z;
|
||||
|
||||
albedo *= LerpWhiteTo (detailAlbedo * unity_ColorSpaceDouble.rgb, detailMask);
|
||||
#endif
|
||||
o.Albedo = albedo;
|
||||
o.Alpha = tex.a * tint.a;
|
||||
|
||||
// NORMAL
|
||||
//
|
||||
|
||||
fixed3 bumpX = UnpackScaleNormal(tex2D(_BumpMap, xUV), _BumpScale);
|
||||
fixed3 bumpY = UnpackScaleNormal(tex2D(_BumpMap, yUV), _BumpScale);
|
||||
fixed3 bumpZ = UnpackScaleNormal(tex2D(_BumpMap, zUV), _BumpScale);
|
||||
|
||||
fixed3 bump =
|
||||
bumpX * IN.powerNormal.x
|
||||
+ bumpY * IN.powerNormal.y
|
||||
+ bumpZ * IN.powerNormal.z
|
||||
;
|
||||
|
||||
|
||||
// NORMAL DETAIL
|
||||
//
|
||||
#ifdef _DETAIL
|
||||
fixed3 detailNormalTangentX = UnpackScaleNormal(tex2D (_DetailNormalMap, xUVDetail), _DetailNormalMapScale);
|
||||
fixed3 detailNormalTangentY = UnpackScaleNormal(tex2D (_DetailNormalMap, yUVDetail), _DetailNormalMapScale);
|
||||
fixed3 detailNormalTangentZ = UnpackScaleNormal(tex2D (_DetailNormalMap, zUVDetail), _DetailNormalMapScale);
|
||||
|
||||
fixed3 detailNormalTangent =
|
||||
detailNormalTangentX * IN.powerNormal.x
|
||||
+ detailNormalTangentY * IN.powerNormal.y
|
||||
+ detailNormalTangentZ * IN.powerNormal.z;
|
||||
|
||||
bump = lerp(
|
||||
bump,
|
||||
BlendNormals(bump, detailNormalTangent),
|
||||
detailMask);
|
||||
|
||||
#endif
|
||||
|
||||
o.Normal = normalize(bump);
|
||||
|
||||
// METALLIC/GLOSS
|
||||
//
|
||||
|
||||
fixed2 mg = fixed2(
|
||||
_Metallic,
|
||||
_Glossiness
|
||||
);
|
||||
|
||||
#ifdef _METALLICGLOSSMAP
|
||||
fixed2 mgX = lerp(mg, tex2D(_MetallicGlossMap, xUV).ra, _UsingMetallicGlossMap);
|
||||
fixed2 mgY = lerp(mg, tex2D(_MetallicGlossMap, yUV).ra, _UsingMetallicGlossMap);
|
||||
fixed2 mgZ = lerp(mg, tex2D(_MetallicGlossMap, zUV).ra, _UsingMetallicGlossMap);
|
||||
|
||||
mg =
|
||||
mgX * IN.powerNormal.x
|
||||
+ mgY * IN.powerNormal.y
|
||||
+ mgZ * IN.powerNormal.z;
|
||||
|
||||
#endif
|
||||
o.Metallic = mg.x;
|
||||
o.Smoothness = mg.y;
|
||||
|
||||
// EMISSION
|
||||
//
|
||||
|
||||
#ifndef _EMISSION
|
||||
o.Emission = 0.0;
|
||||
#else
|
||||
fixed3 emissionX = tex2D(_EmissionMap, xUV).rgb;
|
||||
fixed3 emissionY = tex2D(_EmissionMap, yUV).rgb;
|
||||
fixed3 emissionZ = tex2D(_EmissionMap, zUV).rgb;
|
||||
|
||||
o.Emission = (emissionX * IN.powerNormal.x + emissionY * IN.powerNormal.y + emissionZ * IN.powerNormal.z)
|
||||
* _EmissionColor.rgb;
|
||||
|
||||
#endif
|
||||
|
||||
// OCCLUSION
|
||||
//
|
||||
|
||||
#ifdef _OCCLUSION
|
||||
|
||||
fixed occX = tex2D(_OcclusionMap, xUV).g;
|
||||
fixed occY = tex2D(_OcclusionMap, yUV).g;
|
||||
fixed occZ = tex2D(_OcclusionMap, zUV).g;
|
||||
|
||||
o.Occlusion = LerpOneTo(
|
||||
(occX * IN.powerNormal.x + occY * IN.powerNormal.y + occZ * IN.powerNormal.z),
|
||||
_OcclusionStrength);
|
||||
|
||||
#else
|
||||
o.Occlusion = 1.0;
|
||||
#endif
|
||||
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
FallBack "Diffuse"
|
||||
CustomEditor "UVFreePBRShaderGUI"
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user