更新:我找到了原因。着色器是为使用辐射纹理和辐射纹理而构建的。我从来没有使用过 PBR,只是忽略了插槽 6 和 7。我认为它会被忽略,我已经尝试将这部分注释掉,但没有任何改变。这次我编辑了 Irrad./Rad。部分和我 - 至少得到了标准的“环境”照明。我仍然需要找到一些不仅能点亮一个小点的有源灯。因为 PBR 和法线不能与 Ambient 一起使用,非常正常,但是现在,黑暗已经消失了。出于线程的目的,这里是 radiance/irr 的行:
首先,子计算有两个功能:
float3 Diffuse_IBL(in float3 N)
{
//return IrradianceTexture.Sample(IBLSampler, N);
return float3(1.0f, 1.0f, 1.0f) * 0.9f; // here i send a color + an intensity val
// this brought back the ambient..
}
// Approximate specular image based lighting by sampling radiance map at lower mips
// according to roughness, then modulating by Fresnel term.
float3 Specular_IBL(in float3 N, in float3 V, in float lodBias)
{
float mip = lodBias * NumRadianceMipLevels;
float3 dir = reflect(-V, N);
//return RadianceTexture.SampleLevel(IBLSampler, dir, mip);
return float3(1.0f, 1.0f, 1.0f)*lodBias; // just playing around - not valuable :)
}
这些函数在“LightSurface”的末尾调用,主要函数“Apply Disney-style physical based rendering to a surface”,受影响的行是:
// Add diffuse irradiance
float3 diffuse_env = Diffuse_IBL(N);
acc_color += c_diff * diffuse_env;
// Add specular radiance
float3 specular_env = Specular_IBL(N, V, roughness);
acc_color += c_spec * specular_env;
return acc_color;
如果有人有兴趣尝试,它遵循唯一的“专业市场”接受的 PBR 方法,即“粗糙度-金属度-工作流程”。不要被代码中的“镜面反射”混淆,它不仅仅是镜面反射,它更多的是......“标准” - 镜面反射或光泽度不应该使用,这些工作流程只是“闪亮”或某事。着色器被称为“PBREffect.fx”+ 它包含并且可以在例如 GitHub 上的“DirectXTK”中找到。