Вокселизация геометрии шейдера неверна

Я пытаюсь сделать геометрический шейдер (с помощью Shader Maker), чтобы леголизировать модель. Прежде всего, я пытаюсь сделать вокселизацию, но результаты не хороши, и я не могу найти, в чем дело.

В следующем коде идея состоит в том, чтобы найти барицентр входного треугольника, а затем сделать его центром поля, которое я собираюсь создать.

Я знаю, что это не самый элегантный код в мире, но сначала он идет первым, и мне нужно, чтобы он работал...

вот что я получаю: вот что я должен получить:

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 ответа

Решение

Теперь он работает просто отлично, главной проблемой было вычисление центра куба (и фактическое расположение вершины для формирования куба).

номер центра рассчитывается так:

    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;

где бари - барицентр входящего треугольника, а центр - центр куба. Это НЕ лучшее решение, потому что в некоторых формах появляются отверстия, но это то, что я должен был получить.

Спасибо всем за ваши ответы!

Я думаю, что проблема в том, что вы излучаете свои вершины в неправильном порядке. Вершины примитива должны излучаться по часовой стрелке (с точки зрения за пределами сетки). Например, на вашем квадрате +z вы излучаете вершины в следующем порядке (вверху слева), (внизу слева), (вверху справа), (внизу справа), но это должно быть (вверху слева), (вверху справа), (внизу) справа), (внизу слева).

Кроме того, вы должны сохранить код, который находится внутри вашего цикла for, но избавиться от самого цикла. Вы должны испускать только один куб каждый раз, когда запускается геометрический шейдер. Прямо сейчас вы испускаете один и тот же куб несколько раз.

Другие вопросы по тегам