Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Shader "Unlit/triplanar"
- {
- Properties
- {
- _MainTex ("Texture", 2D) = "white" {}
- }
- SubShader
- {
- Tags { "RenderType"="Opaque" }
- LOD 100
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- struct appdata
- {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- float4 tangent : TANGENT;
- };
- struct v2f
- {
- float4 vertex : SV_POSITION;
- float3 worldPos : TEXCOORD1;
- float3 tangentForward : TEXCOORD3;
- };
- sampler2D _MainTex;
- float4 _MainTex_ST;
- v2f vert (appdata v)
- {
- v2f o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.worldPos = mul(unity_ObjectToWorld, v.vertex);
- fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
- fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
- fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;
- float4x4 tangentToWorld = float4x4(worldTangent.x, worldBinormal.x, worldNormal.x, 0.0,
- worldTangent.y, worldBinormal.y, worldNormal.y, 0.0,
- worldTangent.z, worldBinormal.z, worldNormal.z, 0.0,
- 0.0, 0.0, 0.0, 1.0);
- o.tangentForward = mul(tangentToWorld,float4(0, 0, 1, 0)).xyz;
- o.tangentForward = mul(unity_WorldToObject, o.tangentForward);
- return o;
- }
- float4 CalculateContrast(float contrastValue, float4 colorTarget)
- {
- float t = 0.5 * (1.0 - contrastValue);
- return mul(float4x4(
- contrastValue, 0, 0, t,
- 0, contrastValue, 0, t,
- 0, 0, contrastValue, t,
- 0, 0, 0, 1), colorTarget);
- }
- fixed4 frag (v2f i) : SV_Target
- {
- float3 pos = mul(unity_WorldToObject, i.worldPos) / 1024;
- float3 dir = pow(abs(i.tangentForward), 160);
- dir /= dot(dir, 1);
- dir = CalculateContrast(512, float4(dir,0)).rgb;
- float2 uvs = pos.rg * dir.z + pos.gb * dir.x + pos.rb * dir.y;
- fixed4 col = tex2D(_MainTex, uvs);
- return col;
- }
- ENDCG
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement