// 'renderSunDisk' parameter is not supported. // Users should instead create an emissive (or lit) mesh for every relevant light source // (to support multiple stars in space, moons with moon phases, etc). public override void RenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { var pbrSky = builtinParams.skySettings as PhysicallyBasedSky; float r = Vector3.Distance(builtinParams.worldSpaceCameraPos, pbrSky.planetCenterPosition.value); float R = pbrSky.planetaryRadius.value; bool isPbrSkyActive = r > R; // Disable sky rendering below the ground CommandBuffer cmd = builtinParams.commandBuffer; // Precomputation is done, shading is next. Quaternion planetRotation = Quaternion.Euler(pbrSky.planetRotation.value.x, pbrSky.planetRotation.value.y, pbrSky.planetRotation.value.z); Quaternion spaceRotation = Quaternion.Euler(pbrSky.spaceRotation.value.x, pbrSky.spaceRotation.value.y, pbrSky.spaceRotation.value.z); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._PixelCoordToViewDirWS, builtinParams.pixelCoordToViewDirMatrix); s_PbrSkyMaterialProperties.SetVector(HDShaderIDs._WorldSpaceCameraPos1, builtinParams.worldSpaceCameraPos); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._ViewMatrix1, builtinParams.viewMatrix); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._PlanetRotation, Matrix4x4.Rotate(planetRotation)); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._SpaceRotation, Matrix4x4.Rotate(spaceRotation)); if (m_LastPrecomputedBounce != 0) { s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundIrradianceTexture, m_GroundIrradianceTables[0]); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._AirSingleScatteringTexture, m_InScatteredRadianceTables[0]); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._AerosolSingleScatteringTexture, m_InScatteredRadianceTables[1]); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._MultipleScatteringTexture, m_InScatteredRadianceTables[2]); } else { s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundIrradianceTexture, Texture2D.blackTexture); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._AirSingleScatteringTexture, CoreUtils.blackVolumeTexture); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._AerosolSingleScatteringTexture, CoreUtils.blackVolumeTexture); s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._MultipleScatteringTexture, CoreUtils.blackVolumeTexture); } int hasGroundAlbedoTexture = 0; if (pbrSky.groundAlbedoTexture.value != null) { hasGroundAlbedoTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundAlbedoTexture, pbrSky.groundAlbedoTexture.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasGroundAlbedoTexture, hasGroundAlbedoTexture); int hasGroundEmissionTexture = 0; if (pbrSky.groundEmissionTexture.value != null) { hasGroundEmissionTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundEmissionTexture, pbrSky.groundEmissionTexture.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasGroundEmissionTexture, hasGroundEmissionTexture); int hasSpaceEmissionTexture = 0; if (pbrSky.spaceEmissionTexture.value != null) { hasSpaceEmissionTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._SpaceEmissionTexture, pbrSky.spaceEmissionTexture.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasSpaceEmissionTexture, hasSpaceEmissionTexture); s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._RenderSunDisk, renderSunDisk ? 1 : 0); int pass = (renderForCubemap ? 0 : 2) + (isPbrSkyActive ? 0 : 1); CoreUtils.DrawFullScreen(builtinParams.commandBuffer, s_PbrSkyMaterial, s_PbrSkyMaterialProperties, pass); }
private void GetParameters(out float intensity, out float phi, out float backplatePhi, BuiltinSkyParameters builtinParams, HDRISky hdriSky) { intensity = GetSkyIntensity(hdriSky, builtinParams.debugSettings); phi = -Mathf.Deg2Rad * hdriSky.rotation.value; // -rotation to match Legacy... backplatePhi = phi - Mathf.Deg2Rad * hdriSky.plateRotation.value; }
public override bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) { var hdriSky = builtinParams.skySettings as HDRISky; return(hdriSky.enableBackplate.value); }
public override void RenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { var hdriSky = builtinParams.skySettings as HDRISky; float intensity, phi, backplatePhi; GetParameters(out intensity, out phi, out backplatePhi, builtinParams, hdriSky); int passID; if (hdriSky.enableBackplate.value == false) { if (renderForCubemap) { passID = m_RenderCubemapID; } else { passID = m_RenderFullscreenSkyID; } } else { if (renderForCubemap) { passID = m_RenderCubemapWithBackplateID; } else { passID = m_RenderFullscreenSkyWithBackplateID; } } if (hdriSky.enableDistortion.value == true) { m_SkyHDRIMaterial.EnableKeyword("SKY_MOTION"); if (hdriSky.procedural.value == false) { m_SkyHDRIMaterial.EnableKeyword("USE_FLOWMAP"); m_SkyHDRIMaterial.SetTexture(HDShaderIDs._Flowmap, hdriSky.flowmap.value); } else { m_SkyHDRIMaterial.DisableKeyword("USE_FLOWMAP"); } float rot = -Mathf.Deg2Rad * hdriSky.scrollDirection.value; bool upperHemisphereOnly = hdriSky.upperHemisphereOnly.value || hdriSky.procedural.value; Vector4 flowmapParam = new Vector4(upperHemisphereOnly ? 1.0f : 0.0f, scrollFactor, Mathf.Cos(rot), Mathf.Sin(rot)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._FlowmapParam, flowmapParam); #if UNITY_EDITOR // Time.time is not always updated in editor float time = (float)EditorApplication.timeSinceStartup; #else float time = Time.time; #endif scrollFactor += hdriSky.scrollSpeed.value * (time - lastTime) * 0.01f; lastTime = time; } else { m_SkyHDRIMaterial.DisableKeyword("SKY_MOTION"); } m_SkyHDRIMaterial.SetTexture(HDShaderIDs._Cubemap, hdriSky.hdriSky.value); m_SkyHDRIMaterial.SetVector(HDShaderIDs._SkyParam, new Vector4(intensity, 0.0f, Mathf.Cos(phi), Mathf.Sin(phi))); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters0, GetBackplateParameters0(hdriSky)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters1, GetBackplateParameters1(backplatePhi, hdriSky)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters2, GetBackplateParameters2(hdriSky)); m_SkyHDRIMaterial.SetColor(HDShaderIDs._BackplateShadowTint, hdriSky.shadowTint.value); uint shadowFilter = 0u; if (hdriSky.pointLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Punctual); } if (hdriSky.dirLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Directional); } if (hdriSky.rectLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Area); } m_SkyHDRIMaterial.SetInt(HDShaderIDs._BackplateShadowFilter, unchecked ((int)shadowFilter)); // This matrix needs to be updated at the draw call frequency. m_PropertyBlock.SetMatrix(HDShaderIDs._PixelCoordToViewDirWS, builtinParams.pixelCoordToViewDirMatrix); CoreUtils.DrawFullScreen(builtinParams.commandBuffer, m_SkyHDRIMaterial, m_PropertyBlock, passID); }
// 'renderSunDisk' parameter is not supported. // Users should instead create an emissive (or lit) mesh for every relevant light source // (to support multiple stars in space, moons with moon phases, etc). public override void RenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { var pbrSky = builtinParams.skySettings as PhysicallyBasedSky; // TODO: the following expression is somewhat inefficient, but good enough for now. Vector3 X = builtinParams.worldSpaceCameraPos; float r = Vector3.Distance(X, pbrSky.GetPlanetCenterPosition(X)); float R = pbrSky.GetPlanetaryRadius(); bool isPbrSkyActive = r > R; // Disable sky rendering below the ground CommandBuffer cmd = builtinParams.commandBuffer; // Precomputation is done, shading is next. Quaternion planetRotation = Quaternion.Euler(pbrSky.planetRotation.value.x, pbrSky.planetRotation.value.y, pbrSky.planetRotation.value.z); Quaternion spaceRotation = Quaternion.Euler(pbrSky.spaceRotation.value.x, pbrSky.spaceRotation.value.y, pbrSky.spaceRotation.value.z); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._PixelCoordToViewDirWS, builtinParams.pixelCoordToViewDirMatrix); s_PbrSkyMaterialProperties.SetVector(HDShaderIDs._WorldSpaceCameraPos1, builtinParams.worldSpaceCameraPos); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._ViewMatrix1, builtinParams.viewMatrix); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._PlanetRotation, Matrix4x4.Rotate(planetRotation)); s_PbrSkyMaterialProperties.SetMatrix(HDShaderIDs._SpaceRotation, Matrix4x4.Rotate(spaceRotation)); m_PrecomputedData.BindBuffers(cmd, s_PbrSkyMaterialProperties); int hasGroundAlbedoTexture = 0; if (pbrSky.groundColorTexture.value != null) { hasGroundAlbedoTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundAlbedoTexture, pbrSky.groundColorTexture.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasGroundAlbedoTexture, hasGroundAlbedoTexture); int hasGroundEmissionTexture = 0; if (pbrSky.groundEmissionTexture.value != null) { hasGroundEmissionTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._GroundEmissionTexture, pbrSky.groundEmissionTexture.value); s_PbrSkyMaterialProperties.SetFloat(HDShaderIDs._GroundEmissionMultiplier, pbrSky.groundEmissionMultiplier.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasGroundEmissionTexture, hasGroundEmissionTexture); int hasSpaceEmissionTexture = 0; if (pbrSky.spaceEmissionTexture.value != null) { hasSpaceEmissionTexture = 1; s_PbrSkyMaterialProperties.SetTexture(HDShaderIDs._SpaceEmissionTexture, pbrSky.spaceEmissionTexture.value); s_PbrSkyMaterialProperties.SetFloat(HDShaderIDs._SpaceEmissionMultiplier, pbrSky.spaceEmissionMultiplier.value); } s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._HasSpaceEmissionTexture, hasSpaceEmissionTexture); s_PbrSkyMaterialProperties.SetInt(HDShaderIDs._RenderSunDisk, renderSunDisk ? 1 : 0); int pass = (renderForCubemap ? 0 : 2) + (isPbrSkyActive ? 0 : 1); CloudLayer.Apply(builtinParams.cloudLayer, m_PbrSkyMaterial); CoreUtils.DrawFullScreen(builtinParams.commandBuffer, m_PbrSkyMaterial, s_PbrSkyMaterialProperties, pass); }
public override void RenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { var hdriSky = builtinParams.skySettings as HDRISky; float intensity, phi, backplatePhi; GetParameters(out intensity, out phi, out backplatePhi, builtinParams, hdriSky); int passID; if (renderForCubemap) { passID = m_RenderCubemapID; } else { if (hdriSky.enableBackplate.value == false) { passID = m_RenderFullscreenSkyID; } else { passID = m_RenderFullscreenSkyWithBackplateID; } } if (hdriSky.distortionMode.value != HDRISky.DistortionMode.None) { m_SkyHDRIMaterial.EnableKeyword("SKY_MOTION"); if (hdriSky.distortionMode.value == HDRISky.DistortionMode.Flowmap) { m_SkyHDRIMaterial.EnableKeyword("USE_FLOWMAP"); m_SkyHDRIMaterial.SetTexture(HDShaderIDs._Flowmap, hdriSky.flowmap.value); } else { m_SkyHDRIMaterial.DisableKeyword("USE_FLOWMAP"); } var hdCamera = builtinParams.hdCamera; float rot = Mathf.Deg2Rad * (hdriSky.scrollOrientation.GetValue(hdCamera) - hdriSky.rotation.value); bool upperHemisphereOnly = hdriSky.upperHemisphereOnly.value || (hdriSky.distortionMode.value == HDRISky.DistortionMode.Procedural); Vector4 flowmapParam = new Vector4(upperHemisphereOnly ? 1.0f : 0.0f, scrollFactor / 200.0f, -Mathf.Cos(rot), -Mathf.Sin(rot)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._FlowmapParam, flowmapParam); scrollFactor += hdCamera.animateMaterials ? hdriSky.scrollSpeed.GetValue(hdCamera) * (hdCamera.time - lastTime) * 0.01f : 0.0f; lastTime = hdCamera.time; } else { m_SkyHDRIMaterial.DisableKeyword("SKY_MOTION"); } m_SkyHDRIMaterial.SetTexture(HDShaderIDs._Cubemap, hdriSky.hdriSky.value); m_SkyHDRIMaterial.SetVector(HDShaderIDs._SkyParam, new Vector4(intensity, 0.0f, Mathf.Cos(phi), Mathf.Sin(phi))); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters0, GetBackplateParameters0(hdriSky)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters1, GetBackplateParameters1(backplatePhi, hdriSky)); m_SkyHDRIMaterial.SetVector(HDShaderIDs._BackplateParameters2, GetBackplateParameters2(hdriSky)); m_SkyHDRIMaterial.SetColor(HDShaderIDs._BackplateShadowTint, hdriSky.shadowTint.value); uint shadowFilter = 0u; if (hdriSky.pointLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Punctual); } if (hdriSky.dirLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Directional); } if (hdriSky.rectLightShadow.value) { shadowFilter |= unchecked ((uint)LightFeatureFlags.Area); } m_SkyHDRIMaterial.SetInt(HDShaderIDs._BackplateShadowFilter, unchecked ((int)shadowFilter)); // This matrix needs to be updated at the draw call frequency. m_PropertyBlock.SetMatrix(HDShaderIDs._PixelCoordToViewDirWS, builtinParams.pixelCoordToViewDirMatrix); CoreUtils.DrawFullScreen(builtinParams.commandBuffer, m_SkyHDRIMaterial, m_PropertyBlock, passID); }
public override bool RequiresPreRenderClouds(BuiltinSkyParameters builtinParams) { var cloudLayer = builtinParams.cloudSettings as CloudLayer; return(builtinParams.sunLight != null && cloudLayer.CastShadows); }
public void BakeCloudShadows(BuiltinSkyParameters builtinParams) { var cmd = builtinParams.commandBuffer; var cloudLayer = builtinParams.cloudSettings as CloudLayer; Vector4 _Params = builtinParams.sunLight.transform.forward; Vector4 _Params1 = builtinParams.sunLight.transform.right; Vector4 _Params2 = builtinParams.sunLight.transform.up; Vector4 _Params3 = cloudLayer.shadowTint.value; _Params.w = 1.0f / cloudShadowsResolution; _Params3.w = cloudLayer.shadowMultiplier.value * 8.0f; cmd.SetComputeVectorParam(s_BakeCloudShadowsCS, HDShaderIDs._Params, _Params); cmd.SetComputeVectorParam(s_BakeCloudShadowsCS, HDShaderIDs._Params1, _Params1); cmd.SetComputeVectorParam(s_BakeCloudShadowsCS, HDShaderIDs._Params2, _Params2); cmd.SetComputeVectorParam(s_BakeCloudShadowsCS, HDShaderIDs._Params3, _Params3); cmd.SetComputeTextureParam(s_BakeCloudShadowsCS, s_BakeCloudShadowsKernel, _CloudTexture, cloudTextureRT); cmd.SetComputeTextureParam(s_BakeCloudShadowsCS, s_BakeCloudShadowsKernel, _CloudShadows, cloudShadowsRT); var paramsA = cloudLayer.layerA.GetRenderingParameters(0); var paramsB = cloudLayer.layerB.GetRenderingParameters(0); paramsA.Item1.z = paramsA.Item1.z * 0.2f; paramsB.Item1.z = paramsB.Item1.z * 0.2f; paramsA.Item1.w = cloudLayer.upperHemisphereOnly.value ? 1 : 0; paramsB.Item1.w = cloudLayer.opacity.value; s_VectorArray[0] = paramsA.Item1; s_VectorArray[1] = paramsB.Item1; cmd.SetComputeVectorArrayParam(s_BakeCloudShadowsCS, HDShaderIDs._FlowmapParam, s_VectorArray); bool useSecond = (cloudLayer.layers.value == CloudMapMode.Double) && cloudLayer.layerB.castShadows.value; CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "DISABLE_MAIN_LAYER", !cloudLayer.layerA.castShadows.value); CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "USE_SECOND_CLOUD_LAYER", useSecond); if (cloudLayer.layerA.castShadows.value) { CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "USE_CLOUD_MOTION", cloudLayer.layerA.distortionMode.value != CloudDistortionMode.None); CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "USE_FLOWMAP", cloudLayer.layerA.distortionMode.value == CloudDistortionMode.Flowmap); if (cloudLayer.layerA.distortionMode.value == CloudDistortionMode.Flowmap) { cmd.SetComputeTextureParam(s_BakeCloudShadowsCS, s_BakeCloudShadowsKernel, _FlowmapA, cloudLayer.layerA.flowmap.value); } } if (useSecond) { CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "USE_SECOND_CLOUD_MOTION", cloudLayer.layerB.distortionMode.value != CloudDistortionMode.None); CoreUtils.SetKeyword(s_BakeCloudShadowsCS, "USE_SECOND_FLOWMAP", cloudLayer.layerB.distortionMode.value == CloudDistortionMode.Flowmap); if (cloudLayer.layerB.distortionMode.value == CloudDistortionMode.Flowmap) { cmd.SetComputeTextureParam(s_BakeCloudShadowsCS, s_BakeCloudShadowsKernel, _FlowmapB, cloudLayer.layerB.flowmap.value); } } const int groupSizeX = 8; const int groupSizeY = 8; int threadGroupX = (cloudShadowsResolution + (groupSizeX - 1)) / groupSizeX; int threadGroupY = (cloudShadowsResolution + (groupSizeY - 1)) / groupSizeY; cmd.DispatchCompute(s_BakeCloudShadowsCS, s_BakeCloudShadowsKernel, threadGroupX, threadGroupY, 1); cloudShadowsRT.rt.IncrementUpdateCount(); }