簡體   English   中英

GLSL燈/高亮移動相機

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM