[英]GLSL light/highlight moving with camera
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);
}
任何幫助將非常感激!
問題是:你希望燈光在哪個坐標系(參考系)? 可能是“世界”。
然而,OpenGL的固定功能管道沒有世界坐標的概念,因為它使用了模型視圖矩陣,它直接從眼睛(相機)坐標轉換為模型坐標。 為了擁有“固定”燈,您可以執行以下操作之一:
經典的OpenGL方法是,每一幀,將模型視圖矩陣設置為僅視圖變換(即,您要指定光位置的坐標系),然后使用glLight
設置位置(指定的位置)將模型視圖矩陣應用於輸入)。
由於您使用着色器,您還可以使用單獨的模型和視圖矩陣,並使着色器將兩者(而不是使用ftransform)應用於頂點,但僅將視圖矩陣應用於燈光。 然而,這意味着更多的每頂點矩陣運算,並且可能不是一個特別好的主意,除非您正在尋找清晰度而不是性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.