GLSL 灯光/高光随相机移动

Posted

技术标签:

【中文标题】GLSL 灯光/高光随相机移动【英文标题】:GLSL light/highlight moving with camera 【发布时间】:2011-12-04 14:24:55 【问题描述】:

VC++ 2010、OpenGL、GLSL、SDL

我正在转向着色器,并且遇到了最初在使用 ogl 管道时出现的问题。也就是说,灯光的位置似乎指向我的相机所面对的任何方向。在 ogl 管道中,它只是高光,可以通过以下方式修复:

glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);

这是两个着色器:

顶点

varying vec3 lightDir,normal;

void main()

    normal = normalize(gl_NormalMatrix * gl_Normal);
    lightDir = normalize(vec3(gl_LightSource[0].position));

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();

片段

varying vec3 lightDir,normal;
uniform sampler2D tex;

void main()

    vec3 ct,cf;
    vec4 texel;
    float intensity,at,af;

    intensity = max(dot(lightDir,normalize(normal)),0.0);

    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
                        gl_FrontMaterial.ambient.rgb;
    af = gl_FrontMaterial.diffuse.a;

    texel = texture2D(tex,gl_TexCoord[0].st);
    ct = texel.rgb;
    at = texel.a;

    gl_FragColor = vec4(ct * cf, at * af);  

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

问题是:您希望灯光位于哪个坐标系(参考系)中?可能是“世界”。

然而,OpenGL 的固定功能管道没有世界坐标的概念,因为它使用 modelview 矩阵,该矩阵直接从眼睛(相机)坐标转换为模型坐标。为了获得“固定”灯,您可以执行以下操作之一:

经典的 OpenGL 方法是,每一帧,将模型视图矩阵设置为仅 view 变换(即,作为您要在) 然后使用glLight 设置位置(指定将模型视图矩阵应用于输入)。

由于您使用着色器,您还可以拥有单独的模型和视图矩阵,并让着色器将两者(而不是使用 ftransform)应用于顶点,但仅将视图矩阵应用于灯光。但是,这意味着更多的逐顶点矩阵运算,除非您追求的是清晰度而不是性能,否则这可能不是一个特别好的主意。

【讨论】:

虽然我发现这实际上不是我的问题,但这让我找到了正确的答案。所以谢谢。 (这是一个法线贴图问题)

以上是关于GLSL 灯光/高光随相机移动的主要内容,如果未能解决你的问题,请参考以下文章

镜面高光取决于相机距离

仅在相机视图前生成敌人游戏对象,同时相机随玩家游戏对象移动

如何停止位置光随相机移动

GLSL 大气散射不随变换缩放

在 GLSL 中让相机正常

如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?