- Home /
 
How can I make a skybox respect oblique frustum?
I'm using this script from the Manual to set my vanishing point away from the center. http://docs.unity3d.com/Documentation/Manual/ObliqueFrustum.html It work's great, except that the skybox dosn't respect the change in the projection matrix. Can this be fixed in the skybox shader? How?
Answer by DMGregory · Jun 05, 2014 at 05:45 PM
I know this question is from a while ago, but I just encountered this problem recently and found a solution today.
From what I can tell, Unity passes a different projection matrix when rendering skyboxes, one that omits the obliqueness parameters.
I made a copy of the built-in skybox cubed shader and applied the obliqueness manually:
 Shader "Custom/Skybox Oblique" {
 Properties {
     _Tint ("Tint Color", Color) = (.5, .5, .5, .5)
     _Tex ("Cubemap", Cube) = "white" {}
     _Obliqueness ("Obliqueness", Vector) = (0, 0, 0, 0)
 }
 
 SubShader {
     Tags { "Queue"="Background" "RenderType"="Background" }
     Cull Off ZWrite Off Fog { Mode Off }
 
     Pass {
         
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
 
         #include "UnityCG.cginc"
 
         samplerCUBE _Tex;
         fixed4 _Tint;
         float4 _Obliqueness;
         
         struct appdata_t {
             float4 vertex : POSITION;
             float3 texcoord : TEXCOORD0;
         };
 
         struct v2f {
             float4 vertex : POSITION;
             float3 texcoord : TEXCOORD0;
         };
 
         v2f vert (appdata_t v)
         {
             v2f o;
             o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);            
             o.vertex.xy += _Obliqueness.xy * o.vertex.w;
             o.texcoord = v.texcoord;
             return o;
         }
 
         fixed4 frag (v2f i) : COLOR
         {
             fixed4 tex = texCUBE (_Tex, i.texcoord);
             fixed4 col;
             col.rgb = tex.rgb + _Tint.rgb - unity_ColorSpaceGrey;
             col.a = tex.a * _Tint.a;
             return col;
         }
         ENDCG 
     }
 }     
 
 
 Fallback Off
 
 }
 
               Your code that sets the obliqueness on the camera projection matrix should then also provide the values to the RenderSettings.skybox material using SetVector (remember to cache a local copy of the material so you don't inadvertently modify assets on-disc), and both the skybox and camera should then stay in sync.
Your answer
 
             Follow this Question
Related Questions
Changing camera.projectionMatrix doesn't affect skyboxes? 0 Answers
changing camera view 3 Answers
how to change progection matrix for some objects 0 Answers
How to make an Off-axis / Off-center camera ? 2 Answers
Reproduce WorldToViewportPoint function 2 Answers