2013-03-24 25 views
1

,我已經看到了一個着色器腳本,它不會。但我被有些迷糊延期着色變換頂點着色器does.such如下所示:opengl中光計算所屬的空間是什麼?上週

VERT:

varying vec3 normals; 
varying vec4 position; 
uniform mat4 ModelMatrix; 
uniform mat4 WorldMatrix; 

void main(void) 
{ 
    // Move the normals back from the camera space to the world space 
    mat3 worldRotationInverse = transpose(mat3(WorldMatrix)); 

    gl_Position  = gl_ModelViewProjectionMatrix * gl_Vertex; 
    gl_TexCoord[0] = gl_MultiTexCoord0; 
    **normals   = normalize(worldRotationInverse * gl_NormalMatrix * gl_Normal);   <<<<<** 
    position  = gl_ModelViewMatrix * gl_Vertex; 
    gl_FrontColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

斷枝:

varying vec4  position; 
varying vec3  normals; 
varying mat4  TBN; 
uniform sampler2D tDiffuse; 

void main(void) 
{ 
    gl_FragData[0]  = vec4(texture2D(tDiffuse,gl_TexCoord[0].st).rgb, 0); 
    gl_FragData[1]  = vec4(position.xyz,0); 
    gl_FragData[2]  = vec4(normals.xyz,0); 
} 

我真的不明白,爲什麼.beacause,我認爲這是在眼位(cameraspace)正常的原因變換正常到世界空間(模型空間),至少可以消除無形的頂點,甚至ploygon。我不知道我是否理解錯誤與否。

+0

你的#版本指令在哪裏? – genpfault 2013-03-24 23:51:26

回答

2

只要所有的物體和光線都在同一個空間內,就可以在任何預投影空間(例如世界座標或眼睛座標)中完成照明。

該着色器在眼睛座標中進行照明 - 您可以通過使用傳統的gl_NormalMatrix隱式均勻變量來判斷。這種方法模仿了傳統OpenGL流水線中所做的工作,其中在眼睛座標中完成照明(當沒有着色器時由OpenGL實現完成)。在眼睛座標中進行照明沒有任何問題,但它不像其他空間那麼直觀。

更現代的方法在世界座標中進行照明,並且不需要使用正常的變換矩陣(這是當前模型視圖矩陣的上部3x3的逆轉置)。

+0

如果在世界空間進行照度計算,您仍然需要將法線從模型空間轉換到世界空間。不管你如何改變它,你都不會繞過法線。現代的方法是在視圖/眼睛/相機空間進行照明計算,尤其是延遲着色,因爲這消除了在幾何緩衝區中需要額外的位平面(您可以保存Z),因爲背投影變得更簡單。 – datenwolf 2013-03-24 15:40:15

+0

嗨! @ radical7,@ datenwolf。據我所知,opengl沒有世界空間這樣的概念。它怎麼能這樣做? //將法線從相機空間移回到世界空間 ** mat3 worldRotationInverse = transpose(mat3(WorldMatrix)); normals = normalize(worldRotationInverse * gl_NormalMatrix * gl_Normal ** – 2013-03-24 16:16:29

+1

@haohaochao:您正在使用着色器; OpenGL在[* clip space *]之前沒有任何空間的概念(http://www.opengl.org/ wiki/Vertex_Post-Processing#Clipping)。*您*定義*您想要使用的概念。 – 2013-03-24 20:23:16