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 ループ内のコードはそのままにしておく必要がありますが、ループ自体は削除してください。ジオメトリ シェーダーを実行するたびに、キューブを 1 つだけ放出する必要があります。現在、同じキューブを複数回放出しています。

于 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 に答える