2013-01-10 85 views
0

我試圖製作一個幾何着色器(使用着色器製造商)來對一個模型進行綁定。首先我嘗試做體素化,但結果不好,我找不到它的錯誤。幾何着色器體素化錯誤

恩以下代碼的想法是找到輸入三角形的中心,然後使其成爲即將創建的框的中心。

我知道是不是世界上最優雅的代碼,但首先進入第一,我需要使其工作...

這就是即時得到:enter image description here 這是我應該得到:enter image description here

uniform float stepi; 

void main(void){ 

    float step = stepi/2.; 

    vec3 bari = {(gl_PositionIn[0].x + gl_PositionIn[1].x +gl_PositionIn[2].x)/3, 
(gl_PositionIn[0].y + gl_PositionIn[1].y +gl_PositionIn[2].y)/3, 
(gl_PositionIn[0].z + gl_PositionIn[1].z +gl_PositionIn[2].z)/3}; 

    vec3 bar = bari; 

    float dist = 0; 

    for(int i = 0 ; i < gl_VerticesIn ; i++) 
    { 
     gl_FrontColor = gl_FrontColorIn[ i ]; 
     gl_TexCoord[0] = gl_TexCoordIn [ i ][ 0 ]; 
//-x 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//-y 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     EndPrimitive(); 

//-z 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 
//+x 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//+z 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y-step,bar.z+step,1) ; 
     EmitVertex(); 
EndPrimitive(); 

//+y 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z+step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x-step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     gl_Position = gl_ModelViewProjectionMatrix * vec4(bar.x+step,bar.y+step,bar.z-step,1) ; 
     EmitVertex(); 
     EndPrimitive(); 

    } 
} 
+2

你使用什麼原始類型,三角形或四邊形? – bwroga

+0

是的,體素化三角形可能看起來很奇怪,這取決於你的基元。以四邊形爲例,由兩個三角形組成。一個三角形的質心會比另一個三角形的質心略低,並且所得到的體素可能沿着所有軸看起來彼此偏移。至少這是從直覺猜測的。 –

+0

「這是我應該得到的:」你的算法不能做到這一點。簡單地在三角形中心創建一個立方體不會達到你想要的。 –

回答

0

現在工作得很好,主要的問題是立方體的中心的計算(和頂點的實際配置,形成立方體

中心號是中求出像:

vec3 bari = vec3((gl_PositionIn[0].xyz+gl_PositionIn[1].xyz+gl_PositionIn[2].xyz)/3); 

vec3 centre = floor((bari/stepi)+(0.5,0.5,0.5)); 
centre = centre * stepi; 

,其中巴里是輸入三角中心的baricenter是立方體的中心。是不是最好的解決辦法,因爲在一些形狀出現漏洞,但是這就是我suposed獲得。

謝謝所有,爲您的答案!

1

我認爲問題在於你是以錯誤的順序發射你的頂點。基元的頂點應該按照順時針順序發射(從網格外部的角度看)。例如在你的+ z四邊形上,你按照這個順序(左上角),(左下角),(右上角),(右下角)發出頂點,但它應該是(左上角),(右上角),右), (左下角)。

此外,你應該保留在你的循環內的代碼,但擺脫循環本身。每次運行幾何着色器時,您只應該發出一個立方體。現在你多次發射同一個立方體。

+0

請參閱我的修訂答案。 – bwroga

+0

再次修改答案。 – bwroga

+0

其實Z中的順序是正確的。你在哪裏正確的循環雖然。 最後,我得到它的工作,主要問題是,我需要分散立方體形成的立場。現在它工作得很好!謝謝 –