黄色是材料的底色。镜面反射的颜色是红色,可以正确看到。
粗糙度= 0.2f;
粗糙度= 0.04f;
#1 楼
由RichieSams,trichoplax和xpicox解决的问题。谢谢大家的回答。降低粗糙度,更改材料的颜色并反转ViewDirection,然后终于开始看到适当的镜面反射:)。
固定代码: />
#version 330 core
in vec3 Position;
in vec2 TexCoord0;
in vec3 Normal;
in vec3 Tangent;
out vec4 FinalColor;
uniform vec3 uCameraPosition;
#define PI 3.1415926f
#define EPSILON 10e-5f
#define saturate(value) clamp(value, 0.0f, 1.0f);
float BRDF_Lambert(float NdotL)
{
return NdotL;
}
// Got these BRDF formulas Moving Frostbite to PBR slide by Sebastien Lagarde & Charles de Rousiers
// http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr_v2.pdf
float BRDF_D_GGX(float NdotH, float Roughness)
{
float Roughness2 = Roughness * Roughness;
float f = (NdotH * Roughness2 - NdotH) * NdotH + 1.0f;
return Roughness2 / (f * f + EPSILON);
}
float BRDF_F_FresnelSchlick(float LdotH, float F0)
{
float f = F0 + (1.0f - F0) * pow((1.0f - LdotH), 5);
return f;
}
float BRDF_G_SmithGGXCorrelated(float NdotL, float NdotV, float Roughness)
{
float Roughness2 = Roughness * Roughness;
float GV = NdotL * sqrt((-NdotV * Roughness2 + NdotV) * NdotV + Roughness2);
float GL = NdotV * sqrt((-NdotL * Roughness2 + NdotL) * NdotL + Roughness2);
return 0.5f / (GV + GL + EPSILON);
}
float BRDF_Specular(float NdotV, float NdotL, float NdotH, float LdotH, float Roughness, float F0)
{
float D = BRDF_D_GGX(NdotH, Roughness);
float F = BRDF_F_FresnelSchlick(LdotH, F0);
float G = BRDF_G_SmithGGXCorrelated(NdotL, NdotV, Roughness);
return (D * F * G) / PI;
}
void main()
{
vec3 normal = normalize(Normal);
vec4 BaseColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
vec4 SpecularColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
vec3 LightDirection = normalize(vec3(0, 4, 4) - Position);
vec3 ViewDirection = normalize(uCameraPosition - Position);
vec3 HalfVector = normalize(ViewDirection + LightDirection);
float Roughness = 0.04f;
float RefractiveIndex = 0.24f; // RI for Gold materials. I got this from http://refractiveindex.info/
float F0 = pow(((1.0f - RefractiveIndex) / (1.0f + RefractiveIndex)), 2);
float NdotL = saturate(dot(LightDirection, normal));
float NdotV = abs(dot(ViewDirection, normal)) + EPSILON; // Avoid artifact - Ref: SIGGRAPH14 - Moving Frosbite to PBR
float LdotH = saturate(dot(LightDirection, HalfVector));
float NdotH = saturate(dot(normal, HalfVector));
float DiffuseFactor = BRDF_Lambert(NdotL);
float SpecularFactor = 0.0f;
if(DiffuseFactor > 0.0f)
{
SpecularFactor = BRDF_Specular(NdotV, NdotL, NdotH, LdotH, Roughness, F0);
}
FinalColor = BaseColor * DiffuseFactor + SpecularColor * SpecularFactor;
}
最终图像:
评论
我没有对代码进行过多的研究,但是图像似乎还不错。菲涅耳效果显示为红色环。由于粗糙度是如此之高(0.9),因此图像的其余部分大部分为黄色(即大部分为漫射)是有道理的。如果降低粗糙度,可能会得到红色的镜面高光@RichieSams我为不同的粗糙度值添加了新图像,但还看不到红色闪亮的镜面高光。
通常,您的第二张和第三张图像的红色(在黄色扩散区域中)确实比原始图像少。这不是很明显,因为在黄色区域中添加一点红色会使其具有相似的颜色(橙黄色而不是黄色)。如果您显着减少黄色,会看到红色分布的更多细节吗?完全省略黄色可能有助于确定问题所在。
@trichoplax我减少了黄色,但再次看不到红色镜面反射。我只看到红色环(菲涅耳)效果。设置粗糙度值没有关系,我看不到聚焦点的镜面效果。
首先对法线向量进行归一化,然后再使用它,然后viewDirection是从位置到相机的传出向量:uCameraPosition-Position。