我試圖製作一個幾何着色器(使用着色器製造商)來對一個模型進行綁定。首先我嘗試做體素化,但結果不好,我找不到它的錯誤。幾何着色器體素化錯誤
恩以下代碼的想法是找到輸入三角形的中心,然後使其成爲即將創建的框的中心。
我知道是不是世界上最優雅的代碼,但首先進入第一,我需要使其工作...
這就是即時得到: 這是我應該得到:
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();
}
}
你使用什麼原始類型,三角形或四邊形? – bwroga
是的,體素化三角形可能看起來很奇怪,這取決於你的基元。以四邊形爲例,由兩個三角形組成。一個三角形的質心會比另一個三角形的質心略低,並且所得到的體素可能沿着所有軸看起來彼此偏移。至少這是從直覺猜測的。 –
「這是我應該得到的:」你的算法不能做到這一點。簡單地在三角形中心創建一個立方體不會達到你想要的。 –