@@ -42,10 +42,10 @@ public class SkyRenderer
4242
4343 MaterialPropertyBlock m_RenderSkyPropertyBlock = null ;
4444
45- GameObject [ ] m_CubemapFaceCamera = new GameObject [ 6 ] ;
45+ Matrix4x4 [ ] m_faceCameraInvViewProjectionMatrix = new Matrix4x4 [ 6 ] ;
4646 Mesh [ ] m_CubemapFaceMesh = new Mesh [ 6 ] ;
4747
48- Mesh BuildSkyMesh ( Camera camera , bool forceUVBottom )
48+ Mesh BuildSkyMesh ( Vector3 cameraPosition , Matrix4x4 cameraInvViewProjectionMatrix , bool forceUVBottom )
4949 {
5050 Vector4 vertData0 = new Vector4 ( - 1.0f , - 1.0f , 1.0f , 1.0f ) ;
5151 Vector4 vertData1 = new Vector4 ( 1.0f , - 1.0f , 1.0f , 1.0f ) ;
@@ -61,20 +61,19 @@ Mesh BuildSkyMesh(Camera camera, bool forceUVBottom)
6161 // Get view vector based on the frustum, i.e (invert transform frustum get position etc...)
6262 Vector3 [ ] eyeVectorData = new Vector3 [ 4 ] ;
6363
64- Matrix4x4 transformMatrix = camera . cameraToWorldMatrix * camera . projectionMatrix . inverse ;
64+ Matrix4x4 transformMatrix = cameraInvViewProjectionMatrix ;
6565
6666 Vector4 posWorldSpace0 = transformMatrix * vertData0 ;
6767 Vector4 posWorldSpace1 = transformMatrix * vertData1 ;
6868 Vector4 posWorldSpace2 = transformMatrix * vertData2 ;
6969 Vector4 posWorldSpace3 = transformMatrix * vertData3 ;
7070
71- Vector3 temp = camera . GetComponent < Transform > ( ) . position ;
72- Vector4 cameraPosition = new Vector4 ( temp . x , temp . y , temp . z , 0.0f ) ;
71+ Vector4 cameraPos = new Vector4 ( cameraPosition . x , cameraPosition . y , cameraPosition . z , 0.0f ) ;
7372
74- Vector4 direction0 = ( posWorldSpace0 / posWorldSpace0 . w - cameraPosition ) ;
75- Vector4 direction1 = ( posWorldSpace1 / posWorldSpace1 . w - cameraPosition ) ;
76- Vector4 direction2 = ( posWorldSpace2 / posWorldSpace2 . w - cameraPosition ) ;
77- Vector4 direction3 = ( posWorldSpace3 / posWorldSpace3 . w - cameraPosition ) ;
73+ Vector4 direction0 = ( posWorldSpace0 / posWorldSpace0 . w - cameraPos ) ;
74+ Vector4 direction1 = ( posWorldSpace1 / posWorldSpace1 . w - cameraPos ) ;
75+ Vector4 direction2 = ( posWorldSpace2 / posWorldSpace2 . w - cameraPos ) ;
76+ Vector4 direction3 = ( posWorldSpace3 / posWorldSpace3 . w - cameraPos ) ;
7877
7978 if ( SystemInfo . graphicsUVStartsAtTop && ! forceUVBottom )
8079 {
@@ -173,16 +172,11 @@ public void Rebuild()
173172
174173 for ( int i = 0 ; i < 6 ; ++ i )
175174 {
176- m_CubemapFaceCamera [ i ] = new GameObject ( ) ;
177- m_CubemapFaceCamera [ i ] . hideFlags = HideFlags . HideAndDontSave ;
178-
179- Camera camera = m_CubemapFaceCamera [ i ] . AddComponent < Camera > ( ) ;
180- camera . projectionMatrix = cubeProj ;
181- Transform transform = camera . GetComponent < Transform > ( ) ;
182- transform . LookAt ( lookAtList [ i ] , UpVectorList [ i ] ) ;
175+ Matrix4x4 lookAt = Matrix4x4 . LookAt ( Vector3 . zero , lookAtList [ i ] , UpVectorList [ i ] ) ;
176+ m_faceCameraInvViewProjectionMatrix [ i ] = Utilities . GetViewProjectionMatrix ( lookAt , cubeProj ) . inverse ;
183177
184178 // When rendering into a texture the render will be flip (due to legacy unity openGL behavior), so we need to flip UV here...
185- m_CubemapFaceMesh [ i ] = BuildSkyMesh ( camera , true ) ;
179+ m_CubemapFaceMesh [ i ] = BuildSkyMesh ( Vector3 . zero , m_faceCameraInvViewProjectionMatrix [ i ] , true ) ;
186180 }
187181 }
188182
@@ -193,12 +187,6 @@ public void Cleanup()
193187 Utilities . Destroy ( m_GGXConvolveMaterial ) ;
194188 Utilities . Destroy ( m_SkyboxCubemapRT ) ;
195189 Utilities . Destroy ( m_SkyboxGGXCubemapRT ) ;
196-
197- for ( int i = 0 ; i < 6 ; ++ i )
198- {
199- Utilities . Destroy ( m_CubemapFaceCamera [ i ] ) ;
200- }
201-
202190 }
203191
204192 public bool IsSkyValid ( SkyParameters parameters )
@@ -207,13 +195,13 @@ public bool IsSkyValid(SkyParameters parameters)
207195 return parameters . skyHDRI != null ;
208196 }
209197
210- private void RenderSky ( Camera camera , SkyParameters skyParameters , Mesh skyMesh , RenderLoop renderLoop )
198+ private void RenderSky ( Matrix4x4 invViewProjectionMatrix , SkyParameters skyParameters , Mesh skyMesh , RenderLoop renderLoop )
211199 {
212200 Shader . EnableKeyword ( "PERFORM_SKY_OCCLUSION_TEST" ) ;
213201
214202 m_RenderSkyPropertyBlock . SetTexture ( "_Cubemap" , skyParameters . skyHDRI ) ;
215203 m_RenderSkyPropertyBlock . SetVector ( "_SkyParam" , new Vector4 ( skyParameters . exposure , skyParameters . multiplier , skyParameters . rotation , 0.0f ) ) ;
216- m_RenderSkyPropertyBlock . SetMatrix ( "_InvViewProjMatrix" , Utilities . GetViewProjectionMatrix ( camera ) . inverse ) ;
204+ m_RenderSkyPropertyBlock . SetMatrix ( "_InvViewProjMatrix" , invViewProjectionMatrix ) ;
217205
218206 var cmd = new CommandBuffer { name = "" } ;
219207 cmd . DrawMesh ( skyMesh , Matrix4x4 . identity , m_SkyHDRIMaterial , 0 , 0 , m_RenderSkyPropertyBlock ) ;
@@ -228,8 +216,7 @@ private void RenderSkyToCubemap(SkyParameters skyParameters, RenderTexture targe
228216 for ( int i = 0 ; i < 6 ; ++ i )
229217 {
230218 Utilities . SetRenderTarget ( renderLoop , target , 0 , ( CubemapFace ) i ) ;
231- Camera faceCamera = m_CubemapFaceCamera [ i ] . GetComponent < Camera > ( ) ;
232- RenderSky ( faceCamera , skyParameters , m_CubemapFaceMesh [ i ] , renderLoop ) ;
219+ RenderSky ( m_faceCameraInvViewProjectionMatrix [ i ] , skyParameters , m_CubemapFaceMesh [ i ] , renderLoop ) ;
233220 }
234221 }
235222
@@ -328,7 +315,8 @@ public void RenderSky(Camera camera, SkyParameters skyParameters, RenderTargetId
328315
329316 // Render the sky itself
330317 Utilities . SetRenderTarget ( renderLoop , colorBuffer , depthBuffer ) ;
331- RenderSky ( camera , skyParameters , BuildSkyMesh ( camera , false ) , renderLoop ) ;
318+ Matrix4x4 invViewProjectionMatrix = Utilities . GetViewProjectionMatrix ( camera ) . inverse ;
319+ RenderSky ( invViewProjectionMatrix , skyParameters , BuildSkyMesh ( camera . GetComponent < Transform > ( ) . position , invViewProjectionMatrix , false ) , renderLoop ) ;
332320 }
333321 }
334322 }
0 commit comments