2013-09-19 7 views
4

Я хочу нарисовать квадрат из данных точки с помощью геометрического шейдера.Как нарисовать квадрат из данных точки с помощью геометрического шейдера

В vertex shader, я испускаю одну точку.

#version 330 core 
void main() { 
    gl_Position = vec4(0, 0, 0, 1.0); 
} 

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

Размер не имеет значения в тот момент, так что модель должна иметь размер 1 (в диапазоне от (-0.5, -0.5) из исходного положения точки к (+0,5, +0,5).

мне нужно помогают вычислить положение испускаемых вершин, как видимые в коде:.?

#version 330 core 

layout(points) in; 
layout(triangle_strip, max_vertices=4) out; 

out vec2 tex_coord; 

uniform mat4x4 model; 
uniform mat4x4 view; 
uniform mat4x4 projection; 

void main() { 
    int i; 
    for(i = 0; i < gl_in.length(); ++i) { 
     mat4x4 trans; 

     trans = //??? 
     gl_Position = projection * view * model * trans * gl_in[i].gl_Position; 
     tex_coord = vec2(0, 0); 
     EmitVertex(); 

     trans = //??? 
     gl_Position = projection * view * model * trans * gl_in[i].gl_Position; 
     tex_coord = vec2(1, 0); 
     EmitVertex(); 

     trans = //??? 
     gl_Position = projection * view * model * trans * gl_in[i].gl_Position; 
     tex_coord = vec2(1, 1); 
     EmitVertex(); 

     trans = //??? 
     gl_Position = projection * view * model * trans * gl_in[i].gl_Position; 
     tex_coord = vec2(0, 1)); 
     EmitVertex(); 
    } 
    EndPrimitive(); 
} 

Я думал использовать trans перевести начальную точку в желаемые координаты Как я понимаю, это

Редактирование для ясности

Я хочу сгенерировать из одной точки то, что еще будет задано буфером вершин; один самолет:

float vertex[] { 
     -0.5, 0.5, 0.0, 
     0.5, 0.5, 0.0, 
     0.5, -0.5, 0.0,  
     -0.5, -0.5, 0.0 
} 

Вместо этого я даю только точку в середине этих точек и хочу создать реальные точки пути вычитания и добавления различий в центр (0,5 и -0.5 и т.д.). Все, что мне нужно, это знать, как применить это преобразование в коде (где находятся ???).

+0

Могу я точно спросить, почему вы хотите это сделать? Точечные спрайты (как правило) выполняют то же самое, производя квадрат, выровненный по экрану, хотя диапазон размеров может быть ограничен. В противном случае все, что вам нужно сделать, это реализовать афишу в геометрическом шейдере. –

+0

@genpfault Насколько я понимаю ваш комментарий, в этом случае мне все равно не нужно будет указывать каждую вершину вручную и, следовательно, сделать геометрический шейдер бесполезным для этого случая? – Appleshell

+0

@ AndonM.Coleman Я не после выравнивания по экрану, я хочу создать квадрат в пространстве модели (как если бы я указал 4 вершины от (-0,5, -0,5) до (0,5, 0,5) в качестве атрибута вершины) и затем обработайте его, как если бы это был обычный квадрат с двумя треугольниками. Поэтому я выполняю манипуляции p * v * m в геометрическом шейдере. – Appleshell

ответ

3

Судя по вашему обновленному вопросу, я думаю, что этот псевдокод должен указывать вам в правильном направлении. Мне кажется, что все, что вы хотите сделать, это смещение координат x и y вашей точки на постоянную величину, поэтому массив - это идеальный способ сделать это.

const vec3 offset [4] = 
    vec3 [] (vec3 (-0.5, 0.5, 0.0), 
      vec3 (0.5, 0.5, 0.0), 
      vec3 (0.5, -0.5, 0.0), 
      vec3 (-0.5, -0.5, 0.0)); 

const vec2 tc  [4] = 
    vec2 [] (vec2 (0.0, 0.0), 
      vec2 (1.0, 0.0), 
      vec2 (1.0, 1.0), 
      vec2 (0.0, 1.0)); 

void 
main (void) 
{ 
    int i; 
    for (i = 0; i < gl_in.length(); ++i) { 
    gl_Position = projection * view * model * (gl_in [i].gl_Position + offset [0]); 
    tex_coord = tc [0]; 
    EmitVertex (); 

    gl_Position = projection * view * model * (gl_in [i].gl_Position + offset [1]); 
    tex_coord = tc [1]; 
    EmitVertex (); 

    gl_Position = projection * view * model * (gl_in [i].gl_Position + offset [2]); 
    tex_coord = tc [2]; 
    EmitVertex (); 

    gl_Position = projection * view * model * (gl_in [i].gl_Position + offset [3]); 
    tex_coord = tc [3]; 
    EmitVertex (); 
    } 
    EndPrimitive(); 
} 
+0

По моему опыту с этим решением: последние два вектора смещения необходимо поменять местами, но я еще не пробовал текстурирование, поэтому я не знаю об обменивании текстурных коордов. Мой gl_in на самом деле является длиной 1, поэтому вместо цикла по i мне нужна только одна итерация для gl_in [0]. Я не знал, что длина gl_in не будет соответствовать количеству примитивов до некоторого времени в отладке отсутствующей ошибки геометрии (на самом деле две точки достаточно близко, чтобы перекрывать их квадраты), и обнаружил это, сделав диффузный цвет пройденным фрагмент шейдера для первого угла квадрата зависит от этой длины. –

 Смежные вопросы

  • Нет связанных вопросов^_^