From 05fe7479994a507249c744f395ab3d876f81aeac Mon Sep 17 00:00:00 2001 From: gamebabyrocksun <41750362@qq.com> Date: Mon, 20 Mar 2023 13:39:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=A4=BA=E4=BE=8B25?= =?UTF-8?q?=E4=B8=AD=E6=9C=80=E7=BB=88=20IBL=20=E5=90=88=E6=88=90=E5=85=89?= =?UTF-8?q?=E7=85=A7Shader=20=E4=B8=AD=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../25-IBL-MultiInstance-Sphere.cpp | 4 ++-- .../Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.cpp b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.cpp index c654ce4..18dfbc0 100644 --- a/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.cpp +++ b/25-IBL-MultiInstance-Sphere/25-IBL-MultiInstance-Sphere.cpp @@ -4386,9 +4386,9 @@ int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCm float fOffsetX = 2.0f; float fOffsetY = fOffsetX; - float fWidth = 240.f; + float fWidth = 180.f; float fHeight = fWidth; - size_t szCol = 8; + size_t szCol = 10; for (size_t i = 0; i < g_stQuadData.m_nInstanceCount; i++) { diff --git a/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl b/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl index 98fb60a..49e1950 100644 --- a/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl +++ b/25-IBL-MultiInstance-Sphere/Shader/GRS_PBR_IBL_PS_Without_Texture.hlsl @@ -73,18 +73,27 @@ float4 PSMain(ST_GRS_HLSL_PBR_PS_INPUT stPSInput): SV_TARGET float3 kS = F; float3 kD = 1.0 - kS; kD *= 1.0 - stPSInput.m_fMetallic; - + // 采样漫反射辐照度贴图 float3 irradiance = g_texDiffuseCubemap.Sample(g_sapLinear, N).rgb; + + // 与物体表面点P的颜色值相乘 float3 diffuse = irradiance * stPSInput.m_v3Albedo; // IBL镜面反射环境光部分 - const float MAX_REFLECTION_LOD = 4.0; + const float MAX_REFLECTION_LOD = 5.0; // 与镜面反射预积分贴图的 Max Map Level 保持一致 + // 采样镜面反射预积分辐照度贴图 float3 prefilteredColor = g_texSpecularCubemap.SampleLevel(g_sapLinear, R, stPSInput.m_fRoughness * MAX_REFLECTION_LOD).rgb; + + // 采样 BRDF 预积分贴图 float2 brdf = g_texLut.Sample(g_sapLinear, float2(max(dot(N, V), 0.0), stPSInput.m_fRoughness)).rg; + + // 合成计算镜面反射光辐射度,注意使用的是 F0 参数,与公式保持一致 float3 specular = prefilteredColor * (F0 * brdf.x + brdf.y); - // IBL 光照合成 + // IBL 光照合成,注意用 kD 参数再衰减下漫反射成分,与最开初的渲染方程中保持一致 + // m_fA0 是环境遮挡因子,目前总是设置其为 1 float3 ambient = (kD * diffuse + specular) * stPSInput.m_fAO; + // 直接光照 + IBL光照 float3 color = ambient + Lo; -- GitLab