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 灯光/高光随相机移动的主要内容,如果未能解决你的问题,请参考以下文章