/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include #include #include #include ShaderResourceGroup PassSrg : SRG_PerPass { Texture2D m_diffuseFrameBuffer; Texture2D m_specularFrameBuffer; Sampler LinearSampler { MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = Clamp; AddressV = Clamp; AddressW = Clamp; }; } PSOutput MainPS(VSOutput IN) { PSOutput OUT; // 2x2 box filter to reduce noises introduced by undersampled subsurface scattering float4 diffuse = PassSrg::m_diffuseFrameBuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord); if(diffuse.w > 0.0) { // Center pixel always valid float3 sum = 0.25 * diffuse.rgb; float weightSum = 0.25; float3 color; float weight; // Up color = PassSrg::m_diffuseFrameBuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord, int2(0, -1)).rgb; weight = color.x + color.y + color.z > 0.0 ? 0.25 : 0.0; sum += weight * color; weightSum += weight; // Left color = PassSrg::m_diffuseFrameBuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord, int2(-1, 0)).rgb; weight = color.x + color.y + color.z > 0.0 ? 0.25 : 0.0; sum += weight * color; weightSum += weight; // Upperleft color = PassSrg::m_diffuseFrameBuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord, int2(-1, -1)).rgb; weight = color.x + color.y + color.z > 0.0 ? 0.25 : 0.0; sum += weight * color; weightSum += weight; diffuse = float4(sum / weightSum, 1.0); } float4 specular = PassSrg::m_specularFrameBuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord); OUT.m_color = float4(diffuse.rgb, 1.0) + specular; return OUT; }