whiteflare

customizing VRChat/Panosphere

Oct 19th, 2020 (edited)
1,066
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "VRChat/Panosphere" {
  2.     Properties {
  3.             _MainTex        ("MainTex", 2D)             = "white" {}
  4.         [Toggle(_)]
  5.             _StereoEnabled  ("Stereo Enabled", Float )  = 1
  6.         [Enum(OFF,0,FRONT,1,BACK,2)]
  7.             _CullMode       ("Cull Mode", int)          = 2
  8.     }
  9.  
  10.     SubShader {
  11.         Tags {
  12.             "RenderType"="Opaque"
  13.         }
  14.         Pass {
  15.             Name "FORWARD"
  16.             Tags {
  17.                 "LightMode"="ForwardBase"
  18.             }
  19.  
  20.             Cull [_CullMode]
  21.  
  22.             CGPROGRAM
  23.  
  24.             #pragma vertex vert
  25.             #pragma fragment frag
  26.  
  27.             #include "UnityCG.cginc"
  28.  
  29.             #pragma multi_compile_fwdbase
  30.             #pragma multi_compile_instancing
  31.             #pragma only_renderers d3d9 d3d11 glcore gles gles3 n3ds wiiu
  32.  
  33.             #pragma target 3.0
  34.  
  35.             struct VertexInput {
  36.                 float4 vertex   : POSITION;
  37.                 UNITY_VERTEX_INPUT_INSTANCE_ID
  38.             };
  39.  
  40.             struct VertexOutput {
  41.                 float4 pos      : SV_POSITION;
  42.                 float4 posWorld : TEXCOORD0;
  43.                 UNITY_VERTEX_INPUT_INSTANCE_ID
  44.                 UNITY_VERTEX_OUTPUT_STEREO
  45.             };
  46.  
  47.             uniform sampler2D _MainTex;
  48.             uniform float4 _MainTex_ST;
  49.             uniform fixed _StereoEnabled;
  50.  
  51.             VertexOutput vert(VertexInput v) {
  52.                 VertexOutput o;
  53.  
  54.                 UNITY_INITIALIZE_OUTPUT(VertexOutput, o);
  55.                 UNITY_SETUP_INSTANCE_ID(v);
  56.                 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  57.  
  58.                 o.posWorld  = mul(unity_ObjectToWorld, v.vertex);
  59.                 o.pos       = UnityObjectToClipPos(v.vertex);
  60.  
  61.                 UNITY_TRANSFER_INSTANCE_ID(v, o);
  62.  
  63.                 return o;
  64.             }
  65.  
  66.             float2 StereoPanoProjection(float3 coords) {
  67.                 float lat   = acos(coords.y);
  68.                 float lon   = atan2(coords.z, coords.x);
  69.                 float2 uv   = float2(0.5, 1.0) - float2(lon, lat) * float2(UNITY_INV_TWO_PI, UNITY_INV_PI);
  70. #ifdef USING_STEREO_MATRICES
  71.                 uv.y += lerp(0, 1 - unity_StereoEyeIndex, _StereoEnabled);
  72. #endif
  73.                 uv.y *= lerp(1, 0.5, _StereoEnabled);
  74.                 return uv;
  75.             }
  76.  
  77.             fixed4 frag(VertexOutput i): SV_Target {
  78.                 UNITY_SETUP_INSTANCE_ID(i);
  79.                 UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
  80.  
  81.                 float3 ws_dir_vertex = normalize(i.posWorld.xyz - _WorldSpaceCameraPos.xyz);
  82.                 float2 uv = StereoPanoProjection(ws_dir_vertex);
  83.  
  84.                 return fixed4(tex2D(_MainTex, TRANSFORM_TEX(uv, _MainTex)).rgb, 1);
  85.             }
  86.  
  87.             ENDCG
  88.         }
  89.     }
  90.  
  91.     FallBack "Diffuse"
  92. }
  93.  
RAW Paste Data