Glsl Ashikhmin-Shirley模型实现:丑陋的结果
我试图使用以下公式实现Ashikhmin-Shirley模型: 这是GLSL 1.2片段着色器代码:Glsl Ashikhmin-Shirley模型实现:丑陋的结果,glsl,shader,fragment-shader,Glsl,Shader,Fragment Shader,我试图使用以下公式实现Ashikhmin-Shirley模型: 这是GLSL 1.2片段着色器代码: uniform vec4 materialAmbient, materialDiffuse, materialSpecular; uniform float materialShininess; uniform vec4 lightAmbient, lightDiffuse, lightSpecular, lightPosition; varying vec3 P,N; float pi
uniform vec4 materialAmbient, materialDiffuse, materialSpecular;
uniform float materialShininess;
uniform vec4 lightAmbient, lightDiffuse, lightSpecular, lightPosition;
varying vec3 P,N;
float pi= 3.1415926535;
vec4 Fd(float NdotV, float NdotL) {
vec4 fd= (28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi) * (1.0 - materialSpecular * lightSpecular);
fd*= 1.0 - pow(1.0-NdotV/2.0,5.0);
fd*= 1.0 - pow(1.0-NdotL/2.0, 5.0);
return fd;
}
vec4 Fr(float u, vec4 specular) {
return specular + (1.0-specular) * pow(1.0 - u, 5.0);
}
// f= phi
vec4 Fs(float VdotH, float NdotH, float NdotL, float NdotV, float et, float eb, float f) {
vec4 fs= Fr(VdotH, materialSpecular * lightSpecular);
fs*= sqrt((et+1.0) * (eb+1.0)) / (8.0 * pi);
fs*= pow(NdotH, et*pow(cos(f),2.0) + eb*pow(sin(f),2.0)) / (VdotH * max(NdotL, NdotV));
return fs;
}
void main(void) {
vec3 L= normalize(vec3(lightPosition) - P);
vec3 V= cameraPosition;
vec3 H= normalize(L+V);
float NdotL= max(dot(N,L),0.0);
float NdotV= max(dot(N,V),0.0);
float NdotH= max(dot(N,H),0.0);
float VdotH= max(dot(V,H),0.0);
gl_FragColor= Fd(NdotV, NdotL) + Fs(VdotH, NdotH, NdotL, NdotV, 128.0,128.0,1.0);
}
我已经检查过了,似乎所有的制服和变化都以正确的方式传递,我从顶点着色器传递了p和N。变量包括:
我想要一个这样的!!也许我使用了错误的φ值和其他值?或者公式有问题 我认为您可能缺少大括号:
vec4 fd= (28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi) * (1.0 - materialSpecular * lightSpecular);
试一试
相反
vec4 fd= ((28.0 * materialDiffuse * lightDiffuse) / (23.0 * pi)) * (1.0 - materialSpecular * lightSpecular);