Геометрический шейдер - укажите на треугольную полосу, не сохраняя мировое положение - PullRequest
1 голос
/ 31 октября 2010

Я просто возился с некоторыми геометрическими шейдерами, берущими список GL_POINTS и выводящими прямоугольник с полосами треугольника.у меня это в основном работает, но когда я увеличиваю / уменьшаю или перемещаюсь по треугольникам, полосы идут повсюду и не сохраняют свое положение в мире, но все еще правильно рисуют прямоугольник.

например, если явведите (5,5,0), что он нарисует треугольную полосу с этими точками, чтобы создать квадрат:

(5, 5, 0)
(5.5, 5, 0)
(5, 5.5, 0)
(5.5, 5.5, 0)

Вершинный шейдер:


// Vertex Shader
#version 130

in vec4 vVertex;

void main(void)
{ 
    gl_Position = gl_ModelViewProjectionMatrix * vVertex;
}

Геометрический шейдер:


version 130 
#extension GL_EXT_geometry_shader4 : enable

void main(void)
{
    vec4 a;
    vec4 b;
    vec4 c;
    vec4 d;

    int i = 0;
    for(i = 0; i  gl_VerticesIn; i++)
    {
        a = gl_PositionIn[i];
        //a.x -= 0.5;
        //a.y -= 0.5;
        //a.z = 0.0;
        gl_Position = a;
        EmitVertex();

        b = gl_PositionIn[i];
        b.x += 0.5;
        //b.y -= 0.5;
        //b.z = 0.0;
        gl_Position = b;
        EmitVertex();

        d = gl_PositionIn[i];
        //d.x -= 0.5;
        d.y += 0.5;
        //d.z = 0.0;
        gl_Position = d;        
        EmitVertex();

        c = gl_PositionIn[i];
        c.x += 0.5;
        c.y += 0.5;
        //c.z = 0.0;
        gl_Position = c;
        EmitVertex();

    }
    EndPrimitive();

}

я, вероятно, упускаю что-то глупое.

Ответы [ 2 ]

3 голосов
/ 31 октября 2010

Умножьте каждую вершину на gl_ModelViewMatrix в своем вершинном шейдере. Гораздо проще рассуждать в мировом пространстве.

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

Редактировать : Я забыл о ModelViewMatrix, который преобразуется в пространство просмотра, извините. Просто передайте вершину в VS, ничего не делая на ней. Это означает, что вы все еще будете в модельном пространстве в GS. Сделайте смещение в GS, затем перед излучением преобразуйте с gl_ModelViewProjectionMatrix.

1 голос
/ 31 октября 2010

Геометрический шейдер запускается после вершинного шейдера. Так что те изменения, которые вы вносите в вершины, вносятся в экранные координаты, а не в мир.

...