var worldToView = lookAt * Matrix4x4 . Scale ( new Vector3 ( 1.0f , 1.0f , - 1.0f ) ) ; // Need to scale -1.0 on Z to match what is being done in the camera.wolrdToCameraMatrix API. ...
var screenSize = new Vector4 ( ( int ) m_SkySettings . resolution , ( int ) m_SkySettings . resolution , 1.0f / ( int ) m_SkySettings . resolution , 1.0f / ( int ) m_SkySettings . resolution ) ;
m_facePixelCoordToViewDirMatrices [ i ] = ComputePixelCoordToWorldSpaceViewDirectionMatrix ( 0.5f * Mathf . PI , screenSize , worldToView , true ) ;
m_facePixelCoordToViewDirMatrices [ i ] = HDUtils . ComputePixelCoordToWorldSpaceViewDirectionMatrix ( 0.5f * Mathf . PI , screenSize , worldToView , true ) ;
}
public static Matrix4x4 ComputePixelCoordToWorldSpaceViewDirectionMatrix ( float verticalFoV , Vector4 screenSize , Matrix4x4 worldToViewMatrix , bool renderToCubemap )
{
// Compose the view space version first.
// V = -(X, Y, Z), s.t. Z = 1,
// X = (2x / resX - 1) * tan(vFoV / 2) * ar = x * [(2 / resX) * tan(vFoV / 2) * ar] + [-tan(vFoV / 2) * ar] = x * [-m00] + [-m20]
// Y = (2y / resY - 1) * tan(vFoV / 2) = y * [(2 / resY) * tan(vFoV / 2)] + [-tan(vFoV / 2)] = y * [-m11] + [-m21]
float tanHalfVertFoV = Mathf . Tan ( 0.5f * verticalFoV ) ;
float aspectRatio = screenSize . x * screenSize . w ;
// Compose the matrix.
float m21 = tanHalfVertFoV ;
float m20 = tanHalfVertFoV * aspectRatio ;
float m00 = - 2.0f * screenSize . z * m20 ;
float m11 = - 2.0f * screenSize . w * m21 ;
float m33 = - 1.0f ;
if ( renderToCubemap )
{
// Flip Y.
m11 = - m11 ;
m21 = - m21 ;
}
var viewSpaceRasterTransform = new Matrix4x4 ( new Vector4 ( m00 , 0.0f , 0.0f , 0.0f ) ,
new Vector4 ( 0.0f , m11 , 0.0f , 0.0f ) ,
new Vector4 ( m20 , m21 , m33 , 0.0f ) ,
new Vector4 ( 0.0f , 0.0f , 0.0f , 1.0f ) ) ;
// Remove the translation component.
var homogeneousZero = new Vector4 ( 0 , 0 , 0 , 1 ) ;
worldToViewMatrix . SetColumn ( 3 , homogeneousZero ) ;
// Flip the Z to make the coordinate system left-handed.
worldToViewMatrix . SetRow ( 2 , - worldToViewMatrix . GetRow ( 2 ) ) ;
// Transpose for HLSL.
return Matrix4x4 . Transpose ( worldToViewMatrix . transpose * viewSpaceRasterTransform ) ;
}
// Sets the global MIP-mapped cubemap '_SkyTexture' in the shader.
m_BuiltinParameters . commandBuffer = cmd ;
m_BuiltinParameters . sunLight = sunLight ;
m_BuiltinParameters . pixelCoordToViewDirMatrix = ComputePixelCoordToWorldSpaceViewDirectionMatrix ( camera . camera . fieldOfView * Mathf . Deg2Rad , camera . screenSize , camera . viewMatrix , false ) ;
m_BuiltinParameters . pixelCoordToViewDirMatrix = HDUtils . ComputePixelCoordToWorldSpaceViewDirectionMatrix ( camera . camera . fieldOfView * Mathf . Deg2Rad , camera . screenSize , camera . viewMatrix , false ) ;
m_BuiltinParameters . invViewProjMatrix = camera . viewProjMatrix . inverse ;
m_BuiltinParameters . screenSize = camera . screenSize ;
m_BuiltinParameters . cameraPosWS = camera . camera . transform . position ;