我成功地进入了DirectX/3D11(SharpDX/C#(,我把一切都变成了现实,最后,我想实现PBR。我非常想要像Disney/Burley这样的唯一BRDF,幸运的是,我在Shader文件夹中找到了Microsoft Shipped PBREffect.fx,这是一个完全符合我目标的HLSL Shader。
最后,我所有的恒定缓冲区都在提供,PBR本身工作得很好——但在更大的场景中,我成功应用的唯一光线会亮得很小,比如镜面反射点和其他一切都保持黑暗。例如,在solarpanel纹理上,如果没有空间光电晕,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
更新:我找到了原因。着色器是为使用"辐射纹理"one_answers"辐照度纹理"而构建的。我从未使用过PBR,只是忽略了插槽6和7。我以为它会被忽略,我已经试着把这个部分评论掉了,但什么都没有改变。这次我编辑了《伊洛德》/雷达部分和我-至少恢复了标准的"环境"照明。我仍然需要找到一些活跃的灯,不仅能照亮一个小地方。因为PBR和法线无法使用"环境光",这很正常,但目前,黑暗已经消失。。出于线程的目的,以下是辐射/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"中找到。