2012-11-15 26 views
1

關於一個主題:假設我有複雜的場景 和一個燈光,我可以通過按順序發送繪製命令 (例如100步)繪製場景。在打開的gl中繪製燈光時的凹凸燈

我可以在連續呼叫之間移動燈嗎?例如,i 會在靠近它的地方繪製桌子,然後將光線0移動到 牆壁,然後繪製牆壁,然後將light0移動到椅子上,然後繪製椅子。 它會有點像它的所有組裝這是合法的 它不會工作,每個整個框架應該有一個燈在 一個位置? (同樣的問題也可以用於其他屬性) tnx

回答

1

corse你可以。光位置僅僅是傳遞給對象的着色器這樣的變量:

uniform vec4 fvAmbient; 
uniform vec4 fvSpecular; 
uniform vec4 fvDiffuse; 
uniform float fSpecularPower; 

uniform sampler2D baseMap; 

varying vec2 Texcoord; 
varying vec3 ViewDirection; 
varying vec3 LightDirection; <------ here is your light position 
varying vec3 Normal; 

void main(void) 
{ 
    vec3 fvLightDirection = normalize(LightDirection); 
    vec3 fvNormal   = normalize(Normal); 
    float fNDotL   = dot(fvNormal, fvLightDirection); 

    vec3 fvReflection  = normalize(((2.0 * fvNormal) * fNDotL) - fvLightDirection); 
    vec3 fvViewDirection = normalize(ViewDirection); 
    float fRDotV   = max(0.0, dot(fvReflection, fvViewDirection)); 

    vec4 fvBaseColor  = texture2D(baseMap, Texcoord); 

    vec4 fvTotalAmbient = fvAmbient * fvBaseColor; 
    vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor; 
    vec4 fvTotalSpecular = fvSpecular * (pow(fRDotV, fSpecularPower)); 

    gl_FragColor = (fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular); 

} 

及其與紋理着色器和一個無限遠POIN的光。

如果您需要在對象之間移動光源,就像改變變量值一樣簡單。

+2

他可能使用固定功能燈,因爲他在說'LIGHT0'。以這種方式使用的匈牙利符號實際上只是爲了混淆程序。你的着色器也缺少'#版本'行。 – Cubic

+0

是的,你可能是對的。但FFP有點過時了,很久沒有忘記,所以我不那麼舒服。但如果他是一名學生,那麼它可能是一個案例。 – JAre

+1

它並沒有被遺忘。大多數網絡上的OpenGL介紹以及幾乎所有(印刷版)書籍都是針對即時模式的FFP OpenGL編寫的。這當然不再有用,但它比OpenGL的體面介紹(以及一般的現代圖形編程,儘管DX方面的情況稍好一些)要容易得多。 – Cubic