我成功地潜入DirectX / 3D11(SharpDX / C#),使一切变得栩栩如生,最后,我想实现PBR。我非常想要像Disney / Burley这样的单一BRDF,幸运的是,我在Shader文件夹中找到了Microsoft Shipped PBREffect.fx,正是我的目标是HLSL Shader。
最后,我所有的常量缓冲区都在传递,PBR本身可以正常工作-但在更大的场景中,我成功施加的唯一灯光非常小,像镜面反射点一样,其他所有灯光都保持黑暗。例如,在太阳能电池板纹理上,如果没有空间电晕,则根本看不到ALBEDO。粗糙度,AO,法线一直都在应用,因为我的环境光是可见的白线,这来自其他贴图。
而且我处于某种可能性之外。我无法实现其他Light解决方案,因为这会积木或覆盖整个PBR。通过所有功能共有不同的实现。
有人在使用此着色器方面有一些经验,并且有一个想法,如何获得“ WORLD Light”,即我在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
更新:我找到了原因。着色器是为使用“辐射纹理”和“辐照纹理”而构建的。我从未使用过PBR,只是忽略了插槽6和7。我以为它将被忽略,我已经尝试将零件注释掉,但是没有任何变化。这次,我编辑了Irrad./Rad。部分和我-至少恢复了标准的“环境”照明。我仍然需要找到一些不仅点亮一点点的主动灯。因为PBR和法线无法在Ambient上使用,所以很正常,但是现在,黑暗消失了。为了线程的目的,这是发光度/ irr的线。:
首先,有2个用于子计算的函数:
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”中找到。