GLSL 镜面光照旋转
Posted
技术标签:
【中文标题】GLSL 镜面光照旋转【英文标题】:GLSL Specular lighting rotation 【发布时间】:2015-11-28 16:46:10 【问题描述】:我正在尝试点亮一个旋转模型,但是在尝试应用镜面光照时,它似乎不正确,并且会在对象周围移动并且会以特定角度消失。
这是顶点着色器的一部分:
void main()
frag_vertex = vec3(mvpMatrix * vec4(position, 1.0));
frag_textureCoord = textureCoord;
frag_colour = colour;
mat3 normalMatrix = transpose(inverse(mat3(mMatrix)));
frag_normal = normalize(normal * normalMatrix);
frag_worldPosition = (vec4(position, 1.0) * mvpMatrix).xyz;
gl_Position = mvpMatrix * vec4(position, 1.0);
这是片段着色器:
vec4 calculateLight(BaseLight base, vec3 direction, vec3 normal)
float diffuseFactor = max(dot(normal, -direction), 0.0);
vec4 diffuseColour = vec4(0.0, 0.0, 0.0, 0.0);
vec4 specularColour = vec4(0.0, 0.0, 0.0, 0.0);
if (diffuseFactor > 0.0)
diffuseColour = vec4(base.colour, 1.0) * base.intensity * diffuseFactor;
vec3 directionToEye = normalize(eyePosition - frag_worldPosition);
vec3 halfDirection = normalize(directionToEye - direction);
float specularFactor = max(dot(frag_normal, halfDirection), 0.0);
specularFactor = pow(specularFactor, specularPower);
if (specularFactor > 0.0)
specularColour = vec4(base.colour, 1.0) * specularIntensity * specularFactor;
return (ambientLight + diffuseColour + specularColour);
void main()
gl_FragColor = frag_colour * material.diffuseColour * texture2D(material.diffuseTexture, frag_textureCoord) * calculateDirectionalLight(directionalLight, frag_normal);
这里的方向是(0, 0, 1),eyePosition代表相机的位置。
在不旋转对象的情况下使用它会给出:
然后将其旋转 80 度将高光移至左侧:
我做错了什么?
谢谢。
【问题讨论】:
【参考方案1】:我认为问题可能是由以下原因引起的:
vec3 halfDirection = normalize(directionToEye - direction);
半向量定义为
Half = normalize(View + Light)
详情请见http://content.gpwiki.org/D3DBook:(Lighting)_Blinn-Phong
【讨论】:
以上是关于GLSL 镜面光照旋转的主要内容,如果未能解决你的问题,请参考以下文章