当我使用我的着色器时,我得到以下结果:
![enter image description here](https://istack.dev59.com/065OB.webp)
一个问题是镜面光有点变形,你可以看到球体三角形;另一个问题是我能在不应该出现的地方看到镜面反射(第二张图片)。一个球体光源使用了顶点着色器,另一个使用了片元着色器。
这是我的顶点光源着色器:
// 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);
}
[编辑2] 正如Joakim所指出的,我没有在片段着色器中对varEyeNormal进行归一化处理。修复后,片段着色器中的结果要好得多。我还在uEyePos上使用了normalize函数,因此镜面反射不再变暗。感谢所有的帮助。