void InitializeSubsurfaceScattering() { // Disney SSS (compute + combine) string kernelName = "SubsurfaceScattering"; m_SubsurfaceScatteringCS = defaultResources.shaders.subsurfaceScatteringCS; m_SubsurfaceScatteringKernel = m_SubsurfaceScatteringCS.FindKernel(kernelName); m_CombineLightingPass = CoreUtils.CreateEngineMaterial(defaultResources.shaders.combineLightingPS); m_CombineLightingPass.SetInt(HDShaderIDs._StencilRef, (int)StencilUsage.SubsurfaceScattering); m_CombineLightingPass.SetInt(HDShaderIDs._StencilMask, (int)StencilUsage.SubsurfaceScattering); m_SSSCopyStencilForSplitLighting = CoreUtils.CreateEngineMaterial(defaultResources.shaders.copyStencilBufferPS); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilRef, (int)StencilUsage.SubsurfaceScattering); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilMask, (int)StencilUsage.SubsurfaceScattering); m_SSSDefaultDiffusionProfile = defaultResources.assets.defaultDiffusionProfile; // fill the list with the max number of diffusion profile so we dont have // the error: exceeds previous array size (5 vs 3). Cap to previous size. m_SSSShapeParamsAndMaxScatterDists = new Vector4[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSTransmissionTintsAndFresnel0 = new Vector4[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSDisabledTransmissionTintsAndFresnel0 = new Vector4[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSWorldScalesAndFilterRadiiAndThicknessRemaps = new Vector4[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSDiffusionProfileHashes = new uint[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSDiffusionProfileUpdate = new int[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; m_SSSSetDiffusionProfiles = new DiffusionProfileSettings[DiffusionProfileConstants.DIFFUSION_PROFILE_COUNT]; // If ray tracing is supported by the asset, do the initialization if (rayTracingSupported) { InitializeSubsurfaceScatteringRT(); } }
void SetDiffusionProfileAtIndex(DiffusionProfileSettings settings, int index) { // if the diffusion profile was already set and it haven't changed then there is nothing to upgrade if (m_SSSSetDiffusionProfiles[index] == settings && m_SSSDiffusionProfileUpdate[index] == settings.updateCount) { return; } // if the settings have not yet been initialized if (settings.profile.hash == 0) { return; } m_SSSShapeParamsAndMaxScatterDists[index] = settings.shapeParamAndMaxScatterDist; m_SSSTransmissionTintsAndFresnel0[index] = settings.transmissionTintAndFresnel0; m_SSSDisabledTransmissionTintsAndFresnel0[index] = settings.disabledTransmissionTintAndFresnel0; m_SSSWorldScalesAndFilterRadiiAndThicknessRemaps[index] = settings.worldScaleAndFilterRadiusAndThicknessRemap; m_SSSDiffusionProfileHashes[index] = settings.profile.hash; // Erase previous value (This need to be done here individually as in the SSS editor we edit individual component) uint mask = 1u << index; m_SSSTexturingModeFlags &= ~mask; m_SSSTransmissionFlags &= ~mask; m_SSSTexturingModeFlags |= (uint)settings.profile.texturingMode << index; m_SSSTransmissionFlags |= (uint)settings.profile.transmissionMode << index; m_SSSSetDiffusionProfiles[index] = settings; m_SSSDiffusionProfileUpdate[index] = settings.updateCount; }
void InitializeSubsurfaceScattering() { // Disney SSS (compute + combine) string kernelName = "SubsurfaceScattering"; m_SubsurfaceScatteringCS = defaultResources.shaders.subsurfaceScatteringCS; m_SubsurfaceScatteringKernel = m_SubsurfaceScatteringCS.FindKernel(kernelName); m_CombineLightingPass = CoreUtils.CreateEngineMaterial(defaultResources.shaders.combineLightingPS); m_CombineLightingPass.SetInt(HDShaderIDs._StencilRef, (int)StencilUsage.SubsurfaceScattering); m_CombineLightingPass.SetInt(HDShaderIDs._StencilMask, (int)StencilUsage.SubsurfaceScattering); m_SSSCopyStencilForSplitLighting = CoreUtils.CreateEngineMaterial(defaultResources.shaders.copyStencilBufferPS); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilRef, (int)StencilUsage.SubsurfaceScattering); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilMask, (int)StencilUsage.SubsurfaceScattering); m_SSSDefaultDiffusionProfile = defaultResources.assets.defaultDiffusionProfile; }
void InitializeSubsurfaceScattering() { // Disney SSS (compute + combine) string kernelName = asset.currentPlatformRenderPipelineSettings.increaseSssSampleCount ? "SubsurfaceScatteringHQ" : "SubsurfaceScatteringMQ"; string kernelNameMSAA = asset.currentPlatformRenderPipelineSettings.increaseSssSampleCount ? "SubsurfaceScatteringHQ_MSAA" : "SubsurfaceScatteringMQ_MSAA"; m_SubsurfaceScatteringCS = defaultResources.shaders.subsurfaceScatteringCS; m_SubsurfaceScatteringKernel = m_SubsurfaceScatteringCS.FindKernel(kernelName); m_SubsurfaceScatteringKernelMSAA = m_SubsurfaceScatteringCS.FindKernel(kernelNameMSAA); m_CombineLightingPass = CoreUtils.CreateEngineMaterial(defaultResources.shaders.combineLightingPS); m_CombineLightingPass.SetInt(HDShaderIDs._StencilMask, (int)HDRenderPipeline.StencilBitMask.LightingMask); m_SSSCopyStencilForSplitLighting = CoreUtils.CreateEngineMaterial(defaultResources.shaders.copyStencilBufferPS); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilRef, (int)StencilLightingUsage.SplitLighting); m_SSSCopyStencilForSplitLighting.SetInt(HDShaderIDs._StencilMask, (int)HDRenderPipeline.StencilBitMask.LightingMask); m_SSSDefaultDiffusionProfile = defaultResources.assets.defaultDiffusionProfile; }
void SetDiffusionProfileAtIndex(DiffusionProfileSettings settings, int index) { // if the diffusion profile was already set and it haven't changed then there is nothing to upgrade if (m_SSSSetDiffusionProfiles[index] == settings && m_SSSDiffusionProfileUpdate[index] == settings.updateCount) { return; } // if the settings have not yet been initialized if (settings.profile.filterKernelNearField == null) { return; } m_SSSThicknessRemaps[index] = settings.thicknessRemaps; m_SSSShapeParams[index] = settings.shapeParams; m_SSSTransmissionTintsAndFresnel0[index] = settings.transmissionTintsAndFresnel0; m_SSSDisabledTransmissionTintsAndFresnel0[index] = settings.disabledTransmissionTintsAndFresnel0; m_SSSWorldScales[index] = settings.worldScales; for (int j = 0, n = DiffusionProfileConstants.SSS_N_SAMPLES_NEAR_FIELD; j < n; j++) { m_SSSFilterKernels[n * index + j].x = settings.profile.filterKernelNearField[j].x; m_SSSFilterKernels[n * index + j].y = settings.profile.filterKernelNearField[j].y; if (j < DiffusionProfileConstants.SSS_N_SAMPLES_FAR_FIELD) { m_SSSFilterKernels[n * index + j].z = settings.profile.filterKernelFarField[j].x; m_SSSFilterKernels[n * index + j].w = settings.profile.filterKernelFarField[j].y; } } m_SSSDiffusionProfileHashes[index] = HDShadowUtils.Asfloat(settings.profile.hash); // Erase previous value (This need to be done here individually as in the SSS editor we edit individual component) uint mask = 1u << index; m_SSSTexturingModeFlags &= ~mask; m_SSSTransmissionFlags &= ~mask; m_SSSTexturingModeFlags |= (uint)settings.profile.texturingMode << index; m_SSSTransmissionFlags |= (uint)settings.profile.transmissionMode << index; m_SSSSetDiffusionProfiles[index] = settings; m_SSSDiffusionProfileUpdate[index] = settings.updateCount; }