0

我成功地潜入了 DirectX/3D11 (SharpDX/C#),我将一切变为现实,最后,我想实现 PBR。我非常想要像 Disney / Burley 这样的唯一 BRDF,幸运的是,我在 Shader 文件夹中找到了 Microsoft Shipped PBREffect.fx,这是一个完全符合我目标的 HLSL 着色器。

最后,我所有的常量缓冲区都在传递,PBR 本身工作正常 - 但在更大的场景中,我成功应用的唯一灯光非常小,如镜面反射点,其他一切都保持黑暗。例如,在太阳能电池板纹理上,如果没有空间光晕,ALBEDO 根本不可见。粗糙度、AO、法线一直都在应用,因为我有可见的环境光遮蔽灯白线,这是来自其他贴图。

我处于某种不可能的境地。我无法实现其他 Light 解决方案,因为这会变砖或覆盖整个 PBR。通过所有功能实现不同的实现。

是否有人对这个着色器有一些经验和想法,如何获得“世界之光”,我在 Bis 场景中的所有对象上都有一个基本亮度。像 1000.0f 和更高的渲染空间。

斯蒂芬。

附上3张截图。

[地图/PBR 完美应用,但仅在聚光灯下] https://i.stack.imgur.com/JeUH3.jpg [黄铜 PBR 材料 - 仅在现场点亮] https://i.stack.imgur .com/KZNK7.png [image1] https://i.stack.imgur.com/Unmvm.jpg

4

1 回答 1

0

更新:我找到了原因。着色器是为使用辐射纹理和辐射纹理而构建的。我从来没有使用过 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”中找到。

于 2020-02-21T05:31:33.910 回答