2014-09-22 6 views
0

Я экспериментирую с геометрическими шейдерами на Macbook Pro с графикой Intel HD 4000, работающей с Mavericks. Я замечаю какое-то странное поведение в вызове EndPrimitive(). Вот мой геометрический шейдер:GLSL EndPrimitive() разбивает треугольную полосу

#version 150 core 

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

void main() { 
    vec4 start_pos = gl_in[0].gl_Position + vec4(-0.5, -0.5, 0.0, 0.0); 
    vec4 bottom_vertex = start_pos; 

    for (int i = 0; i < 17; ++i) { 
     bottom_vertex = start_pos + vec4(float(i) * float(1.0/16.0), 0.0, 0.0, 0.0); 
     gl_Position = bottom_vertex; 
     EmitVertex(); 

     gl_Position = bottom_vertex + vec4(0.0, 1.0/16.0, 0.0, 0.0); 
     EmitVertex(); 
    } 
    //EndPrimitive(); 
} 

Программа использует glfw и запрашивает основной контекст OpenGL 3.2. Я рисую только одну вершину в [0, 0], и моя цель состоит в том, чтобы мой геометрический шейдер вывел квадратную сетку из нескольких треугольных полосок. Шейдер, как есть, выводит одну строку сетки. Вот результат:

apparently correct output

В этот момент я хочу завершить текущий треугольник полосу примитивной и начать новую для следующего ряда. Однако, просто раскомментирован EndPrimitive() вызов в затенении выше шурупов до результата:

broken output

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

Кроме того, я не могу тестировать другую реализацию прямо сейчас, может быть, что моя ошибка? Есть ли что-нибудь, что я могу попытаться выявить эту проблему?

ответ

1

Оказалось, ошибка была в моем основном коде. Я вызывал glDrawArrays() с неправильным значением в качестве последнего параметра. Это, вероятно, неопределенное поведение, поскольку я выпустил вызов, чтобы нарисовать больше очков, чем содержался мой буфер массива. Исправление этой проблемы делает EndPrimitive() работы должным образом.

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

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