12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- //======= Copyright (c) Valve Corporation, All rights reserved. ===============
- // UNITY_SHADER_NO_UPGRADE
- Shader "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
- }
- }
- }
|