2015-01-08 256 views
0

我被幾何着色器卡在OpenGL-C++編程中。我想通過重複6次繪製一個旋轉的牆來創建簡單的立方體。這裏是我的頂點着色器(everyting在序言的#Version 330核心):C++,OpenGL - 幾何着色器

uniform mat4 MVP; 
uniform mat4 ROT; 
layout(location=0) in vec3 vertPos; 
void main(){ 
    vec4 pos=(MVP*ROT*vec4(vertPos,1)); 
    pos.x/=1.5; 
    pos.y/=1.5; 
    gl_Position=pos; 
} 

現在幾何形狀着色器:

layout (triangles) in; 
layout (triangle_strip, max_vertices = 6) out; 
out vec4 pos; 
void main(void) 
{ 
    pos=vec4(1,1,1,1); 
    for (int i = 0; i < 3; i++) 
    { 
     vec4 offset=vec4(i/2.,0,0,0); 
     gl_Position = gl_in[i].gl_Position+offset; 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

現在片段着色器:

uniform mat4 MVP; 
in vec4 pos; 
out vec3 color; 
void main(){ 
    vec3 light=(MVP*vec4(0,0,0,1)).xyz; 
    vec3 dd=pos.xyz-light; 
    float cosTheta=length(dd)*length(dd); 
    color=vec3(1,0,0); 
} 

那麼,有一些垃圾,我也想把陰影放到我的立方體中,但是我發送座標時遇到了問題。主要的問題是 - 在這裏我得到我的縮放廣場(通過MVP矩陣),我甚至可以用基本界面(ROT矩陣)旋轉它,但是當我取消註釋我的「+偏移」線時,我得到一些混亂。我應該怎樣做6次重複清潔?

+1

沒有什麼個人的,但請INDENT您的代碼 – MightyPork

+0

大聲笑,甚至我的朋友都這樣說。我有特殊的腳本來刪除我的代碼中的所有縮進,我喜歡它乾淨。 –

+1

真的嗎?這是一切*但乾淨! – MightyPork

回答

2

它看起來像是在你的幾何着色器中的錯誤。

gl_Position = gl_in[i].gl_Position+offset; 

這增加了偏移......但它增加了剪裁空間,這可能不是你想要的偏移。在頂點着色器中添加偏移量,或者在幾何着色器中進行透視投影。

/* Passthrough vertex shader */ 
layout(location=0) in vec3 vertPos; 
void main(){ 
    gl_Position = vec4(vertPos, 1.0); 
} 

/* Geometry shader */ 
... 
    gl_Position = MVP * (ROT * (gl_in[i].gl_Position + offset)); 
    EmitVertex(); 
... 

另外,我注意到你的頂點着色器中有一些不尋常的東西。

pos.x/=1.5; 
pos.y/=1.5; 

這是不常見的,因爲它是一種直接跟隨矩陣乘法的線性變換。它可能會更直接通過下面的矩陣乘以你的MVP矩陣:

1/1.5  0  0  0 
    0 1/1.5  0  0 
    0  0  1  0 
    0  0  0  1 

這將實現以較少的着色器代碼相同的結果。

+0

現在我給你解決問題的標記,但是我必須檢查這個代碼。謝謝! –

+0

Ehm,我想這只是建議如何使我的代碼更簡單,但我仍然等待最後的精神;) –

+0

此外,我發現調整我的矢量可以簡單地在頂點着色器中完成鍵入gl_Position = vec4(vertPos,1.5 ); –