【发布时间】:2012-10-28 15:18:02
【问题描述】:
当我使用我的着色器时,我得到以下结果:
一个问题是镜面光有点变形,你可以看到球体三角形,另一个问题是,我可以看到我不应该看到的镜面光(第二张图片)。一个球光在顶点着色器中完成,另一个在片段中完成。
这是我的顶点光照着色器的样子: 顶点:
// Material data.
uniform vec3 uAmbient;
uniform vec3 uDiffuse;
uniform vec3 uSpecular;
uniform float uSpecIntensity;
uniform float uTransparency;
uniform mat4 uWVP;
uniform mat3 uN;
uniform vec3 uSunPos;
uniform vec3 uEyePos;
attribute vec4 attrPos;
attribute vec3 attrNorm;
varying vec4 varColor;
void main(void)
{
vec3 N = uN * attrNorm;
vec3 L = normalize(uSunPos);
vec3 H = normalize(L + uEyePos);
float df = max(0.0, dot(N, L));
float sf = max(0.0, dot(N, H));
sf = pow(sf, uSpecIntensity);
vec3 col = uAmbient + uDiffuse * df + uSpecular * sf;
varColor = vec4(col, uTransparency);
gl_Position = uWVP * attrPos;
}
片段:
varying vec4 varColor;
void main(void)
{
//vec4 col = texture2D(texture_0, varTexCoords);
//col.r += uLightDir.x;
//col.rgb = vec3(pow(gl_FragCoord.z, 64));
gl_FragColor = varColor;
}
我从代码中提供的数据有可能是错误的。 uN 是世界矩阵(不是倒置也不是转置,即使这样做似乎没有什么不同)。 UWVP - 世界观投影矩阵。
任何关于问题可能出在哪里的想法都将不胜感激。
[编辑] 这是我在片段中完成的光照计算: 顶点着色器文件:
uniform mat4 uWVP;
uniform mat3 uN;
attribute vec4 attrPos;
attribute vec3 attrNorm;
varying vec3 varEyeNormal;
void main(void)
{
varEyeNormal = uN * attrNorm;
gl_Position = uWVP * attrPos;
}
片段着色器文件:
// Material data.
uniform vec3 uAmbient;
uniform vec3 uDiffuse;
uniform vec3 uSpecular;
uniform float uSpecIntensity;
uniform float uTransparency;
uniform vec3 uSunPos;
uniform vec3 uEyePos;
varying vec3 varEyeNormal;
void main(void)
{
vec3 N = varEyeNormal;
vec3 L = normalize(uSunPos);
vec3 H = normalize(L + uEyePos);
float df = max(0.0, dot(N, L));
float sf = max(0.0, dot(N, H));
sf = pow(sf, uSpecIntensity);
vec3 col = uAmbient + uDiffuse * df + uSpecular * sf;
gl_FragColor = vec4(col, uTransparency);
}
[EDIT2] 正如 Joakim 指出的那样,我没有在片段着色器中规范化 varEyeNormal。修复后,片段着色器的结果要好得多。我还在 uEyePos 上使用了 normalize 功能,因此镜面反射不再出现暗面。感谢大家的帮助。
【问题讨论】:
-
我相信你应该否定你的法线。 (黑暗面的亮点)
-
像这样:vec3 negNormal = vec3(-attrNorm.x, -attrNorm.y, -attrNorm.z); vec3 N = uN * negNormal; ?有了这个,我根本看不到镜面反射。
-
我说的是第二张图片,如果镜面反射也是正的,漫射光应该是正的。你能用这个做一个jsfiddle吗?