Beispiel #1
0
        VolumeVoxelizationParameters PrepareVolumeVoxelizationParameters(HDCamera hdCamera)
        {
            var parameters = new VolumeVoxelizationParameters();

            parameters.viewCount   = hdCamera.viewCount;
            parameters.numBigTileX = GetNumTileBigTileX(hdCamera);
            parameters.numBigTileY = GetNumTileBigTileY(hdCamera);

            parameters.tiledLighting = HasLightToCull() && hdCamera.frameSettings.IsEnabled(FrameSettingsField.BigTilePrepass);
            bool highQuality = volumetricLightingPreset == VolumetricLightingPreset.High;

            parameters.voxelizationCS     = m_VolumeVoxelizationCS;
            parameters.voxelizationKernel = (parameters.tiledLighting ? 1 : 0) | (highQuality ? 2 : 0);

            var currFrameParams = hdCamera.vBufferParams[0];
            var cvp             = currFrameParams.viewportSize;

            parameters.resolution = new Vector4(cvp.x, cvp.y, 1.0f / cvp.x, 1.0f / cvp.y);
#if UNITY_2019_1_OR_NEWER
            var vFoV = hdCamera.camera.GetGateFittedFieldOfView() * Mathf.Deg2Rad;
#else
            var vFoV = hdCamera.camera.fieldOfView * Mathf.Deg2Rad;
#endif
            // Compose the matrix which allows us to compute the world space view direction.
            hdCamera.GetPixelCoordToViewDirWS(parameters.resolution, ref m_PixelCoordToViewDirWS);
            parameters.pixelCoordToViewDirWS = m_PixelCoordToViewDirWS;

            // Compute texel spacing at the depth of 1 meter.
            parameters.unitDepthTexelSpacing = HDUtils.ComputZPlaneTexelSpacing(1.0f, vFoV, parameters.resolution.y);

            parameters.numVisibleVolumes     = m_VisibleVolumeBounds.Count;
            parameters.volumeAtlas           = DensityVolumeManager.manager.volumeAtlas.GetAtlas();
            parameters.volumeAtlasDimensions = new Vector4(0.0f, 0.0f, 0.0f, 0.0f);

            if (parameters.volumeAtlas != null)
            {
                parameters.volumeAtlasDimensions.x = (float)parameters.volumeAtlas.width / parameters.volumeAtlas.depth; // 1 / number of textures
                parameters.volumeAtlasDimensions.y = parameters.volumeAtlas.width;
                parameters.volumeAtlasDimensions.z = parameters.volumeAtlas.depth;
                parameters.volumeAtlasDimensions.w = Mathf.Log(parameters.volumeAtlas.width, 2);              // Max LoD
            }
            else
            {
                parameters.volumeAtlas = CoreUtils.blackVolumeTexture;
            }

            return(parameters);
        }