@@ -42,10 +42,10 @@ public class SkyRenderer
42
42
43
43
MaterialPropertyBlock m_RenderSkyPropertyBlock = null ;
44
44
45
- GameObject [ ] m_CubemapFaceCamera = new GameObject [ 6 ] ;
45
+ Matrix4x4 [ ] m_faceCameraInvViewProjectionMatrix = new Matrix4x4 [ 6 ] ;
46
46
Mesh [ ] m_CubemapFaceMesh = new Mesh [ 6 ] ;
47
47
48
- Mesh BuildSkyMesh ( Camera camera , bool forceUVBottom )
48
+ Mesh BuildSkyMesh ( Vector3 cameraPosition , Matrix4x4 cameraInvViewProjectionMatrix , bool forceUVBottom )
49
49
{
50
50
Vector4 vertData0 = new Vector4 ( - 1.0f , - 1.0f , 1.0f , 1.0f ) ;
51
51
Vector4 vertData1 = new Vector4 ( 1.0f , - 1.0f , 1.0f , 1.0f ) ;
@@ -61,20 +61,19 @@ Mesh BuildSkyMesh(Camera camera, bool forceUVBottom)
61
61
// Get view vector based on the frustum, i.e (invert transform frustum get position etc...)
62
62
Vector3 [ ] eyeVectorData = new Vector3 [ 4 ] ;
63
63
64
- Matrix4x4 transformMatrix = camera . cameraToWorldMatrix * camera . projectionMatrix . inverse ;
64
+ Matrix4x4 transformMatrix = cameraInvViewProjectionMatrix ;
65
65
66
66
Vector4 posWorldSpace0 = transformMatrix * vertData0 ;
67
67
Vector4 posWorldSpace1 = transformMatrix * vertData1 ;
68
68
Vector4 posWorldSpace2 = transformMatrix * vertData2 ;
69
69
Vector4 posWorldSpace3 = transformMatrix * vertData3 ;
70
70
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 ) ;
73
72
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 ) ;
78
77
79
78
if ( SystemInfo . graphicsUVStartsAtTop && ! forceUVBottom )
80
79
{
@@ -173,16 +172,11 @@ public void Rebuild()
173
172
174
173
for ( int i = 0 ; i < 6 ; ++ i )
175
174
{
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 ;
183
177
184
178
// 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 ) ;
186
180
}
187
181
}
188
182
@@ -193,12 +187,6 @@ public void Cleanup()
193
187
Utilities . Destroy ( m_GGXConvolveMaterial ) ;
194
188
Utilities . Destroy ( m_SkyboxCubemapRT ) ;
195
189
Utilities . Destroy ( m_SkyboxGGXCubemapRT ) ;
196
-
197
- for ( int i = 0 ; i < 6 ; ++ i )
198
- {
199
- Utilities . Destroy ( m_CubemapFaceCamera [ i ] ) ;
200
- }
201
-
202
190
}
203
191
204
192
public bool IsSkyValid ( SkyParameters parameters )
@@ -207,13 +195,13 @@ public bool IsSkyValid(SkyParameters parameters)
207
195
return parameters . skyHDRI != null ;
208
196
}
209
197
210
- private void RenderSky ( Camera camera , SkyParameters skyParameters , Mesh skyMesh , RenderLoop renderLoop )
198
+ private void RenderSky ( Matrix4x4 invViewProjectionMatrix , SkyParameters skyParameters , Mesh skyMesh , RenderLoop renderLoop )
211
199
{
212
200
Shader . EnableKeyword ( "PERFORM_SKY_OCCLUSION_TEST" ) ;
213
201
214
202
m_RenderSkyPropertyBlock . SetTexture ( "_Cubemap" , skyParameters . skyHDRI ) ;
215
203
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 ) ;
217
205
218
206
var cmd = new CommandBuffer { name = "" } ;
219
207
cmd . DrawMesh ( skyMesh , Matrix4x4 . identity , m_SkyHDRIMaterial , 0 , 0 , m_RenderSkyPropertyBlock ) ;
@@ -228,8 +216,7 @@ private void RenderSkyToCubemap(SkyParameters skyParameters, RenderTexture targe
228
216
for ( int i = 0 ; i < 6 ; ++ i )
229
217
{
230
218
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 ) ;
233
220
}
234
221
}
235
222
@@ -328,7 +315,8 @@ public void RenderSky(Camera camera, SkyParameters skyParameters, RenderTargetId
328
315
329
316
// Render the sky itself
330
317
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 ) ;
332
320
}
333
321
}
334
322
}
0 commit comments