0

我试图制作一个几何着色器(使用着色器制造商)来使模型合法化。首先,我试图进行体素化,但结果并不好,我找不到它的问题所在。

在下面的代码中,想法是找到输入三角形的重心,然后使其成为我要创建的框的中心。

我知道这不是世界上最优雅的代码,但首先要先行,我需要让它工作......

这就是我得到的:在此处输入图像描述 这就是我应该得到的:在此处输入图像描述

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();

    }
}
4

2 回答 2

1

我认为问题在于您以错误的顺序发射顶点。图元的顶点应按顺时针顺序发射(从网格外部的角度来看)。例如,在您的 +z 四边形上,您按以下顺序发出顶点(左上)、(左下)、(右上)、(右下),但它应该是(左上)、(右上)、(下右),(左下)。

此外,您应该保留 for 循环内的代码,但摆脱循环本身。每次运行几何着色器时,您应该只发射一个立方体。现在你正在多次发射同一个立方体。

于 2013-01-10T16:26:46.997 回答
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;

其中 bari 是传入三角形的重心, center 是立方体的中心。不是最好的解决方案,因为在某些形状中会出现孔,但是这是我应该得到的。

谢谢大家的答案!

于 2013-01-10T22:54:55.583 回答