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);
}
非常感谢任何帮助!
答案 0 :(得分:3)
问题是:您希望灯光在哪个坐标系(参考系)?可能是“世界”。
然而,OpenGL的固定功能管道没有世界坐标的概念,因为它使用 modelview 矩阵,它直接从眼睛(相机)坐标转换为模型坐标。为了获得“固定”灯光,您可以执行以下操作之一:经典的OpenGL方法是,每帧都将模型视图矩阵设置为视图变换(即,您要指定光位置的坐标系) )然后使用glLight
设置位置(指定将模型视图矩阵应用于输入)。
由于您使用着色器,您还可以使用单独的模型和视图矩阵,并使着色器将两者(而不是使用ftransform)应用于顶点,但仅将视图矩阵应用于灯光。但是,这意味着更多的每顶点矩阵运算,除非您正在寻求清晰度而不是性能,否则可能不是一个特别好的主意。