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 镜面光照旋转的主要内容,如果未能解决你的问题,请参考以下文章

字符矩阵的旋转 镜面对称 1.2.2

OpenGL ES 光照效果

GLSL:用旋转矢量旋转?

GLSL 中的正常旋转

GLSL 2D 旋转矩阵无法按预期工作

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转