|
|
//======= Copyright (c) Valve Corporation, All rights reserved. ===============// UNITY_SHADER_NO_UPGRADEShader "Custom/SteamVR_SphericalProjection" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _N ("N (normal of plane)", Vector) = (0,0,0,0) _Phi0 ("Phi0", Float) = 0 _Phi1 ("Phi1", Float) = 1 _Theta0 ("Theta0", Float) = 0 _Theta1 ("Theta1", Float) = 1 _UAxis ("uAxis", Vector) = (0,0,0,0) _VAxis ("vAxis", Vector) = (0,0,0,0) _UOrigin ("uOrigin", Vector) = (0,0,0,0) _VOrigin ("vOrigin", Vector) = (0,0,0,0) _UScale ("uScale", Float) = 1 _VScale ("vScale", Float) = 1 }
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex; float4 _N; float _Phi0, _Phi1, _Theta0, _Theta1; float4 _UAxis, _VAxis; float4 _UOrigin, _VOrigin; float _UScale, _VScale;
struct v2f { float4 pos : SV_POSITION; float2 tex : TEXCOORD0; };
v2f vert(appdata_base v) { v2f o;#if UNITY_VERSION >= 540 o.pos = UnityObjectToClipPos(v.vertex);#else o.pos = mul(UNITY_MATRIX_MVP, v.vertex);#endif o.tex = float2( lerp(_Phi0, _Phi1, v.texcoord.x), lerp(_Theta0, _Theta1, v.texcoord.y)); return o; }
float3 cartesian(float phi, float theta) { float sinTheta = sin(theta); return float3( sinTheta * sin(phi), cos(theta), sinTheta * cos(phi)); }
float4 frag(v2f i) : COLOR { float3 V = cartesian(i.tex.x, i.tex.y); float3 P = V / dot(V, _N.xyz); // intersection point on plane float2 uv = float2( dot(P - _UOrigin.xyz, _UAxis.xyz) * _UScale, dot(P - _VOrigin.xyz, _VAxis.xyz) * _VScale); return tex2D(_MainTex, uv); }
ENDCG
SubShader { Pass { ZTest Always Cull Off ZWrite Off Fog { Mode Off }
CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } }}
|