//======= 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
|
|
}
|
|
}
|
|
}
|