2013-01-10 60 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中的顺序是正确的。你在哪里正确的循环虽然。 最后,我得到它的工作,主要问题是,我需要分散立方体形成的立场。现在它工作得很好!谢谢 –