【问题标题】:Direct3D11 / PBR Shader - Scene keeps too dark - any experience with the a BRDF (Burley/Disney) Shader?Direct3D11 / PBR 着色器 - 场景太暗 - 有 BRDF(白肋烟/迪士尼)着色器的经验吗?
【发布时间】:2020-06-04 18:40:51
【问题描述】:

我成功地潜入了 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

【问题讨论】:

    标签: shader lighting direct3d11 pbr


    【解决方案1】:

    更新:我找到了原因。着色器是为使用辐射纹理和辐射纹理而构建的。我从来没有使用过 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”的末尾被调用,主函数 “将迪士尼风格的基于物理的渲染应用到表面”,受影响的行是:

    // 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”中找到。

    【讨论】:

    • 请注意,对于 DirectX 工具包实现,我们使用基于图像的照明,旨在为基本场景提供漂亮的外观,但可能不是所有引擎的正确解决方案。请参阅wiki 上的参考资料
    • 好的,谢谢。我使用 SharpDX 从 Scratch 潜入 Direct3D,很高兴意外地找到了这个独立于 C++/C# 的着色器——因为我用 C# 编写。所以我会尝试找到一个基于材质/对象的着色器,没有辐射度/irr ..
    • 或者,也许我现在有足够的纸张将所有东西放在一起。如果您为 Flight-Simulator 进行 3D 建模(Prepar3D + 可能是新的),One-Cline PBR-Model/MaterialViewer 会很棒由MS)...查看PBR游戏结果真的很烦人..将3个纹理层合二为一,创建模型,材质并应用,导出并运行模拟器...我目前的方法是:应用一个图层的纹理为“漫反射” - 并运行我的查看器.. 我只是采用“漫反射”图层的路径并找到所有(正确命名的)贴图.. 没有“PBR” - 需要 3D 格式,我喜欢它,所以容易..
    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2018-03-03
    • 2021-06-19
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多