2015-06-29 2 views
0

У меня есть шейдерная программа с циклом for в геометрическом шейдере. Программа связывает (и работает) отлично, когда длина петли для записи достаточно мала. Если я увеличиваю длину, я получаю ошибку ссылки (с пустым журналом). Шейдеры компилируются в обоих случаях. Вот код геометрического шейдера (все, что я думал, что это уместно):Ошибка связи в зависимости от длины цикла

#version 330 
layout (points) in; 
layout (triangle_strip, max_vertices = 256) out; 
... 
void main() 
{ 
    ... 
    for(int i = 0 ; i < 22 ; ++i) // <-- Works with 22, not with 23. 
    { 
     ... 
     EmitVertex(); 
     ... 
     EmitVertex(); 
     ... 
     EmitVertex(); 
     ... 
     EmitVertex(); 

     EndPrimitive(); 
    } 
} 

спецификация состояние: «не являющиеся оконечные петли допускаются Последствия очень длинных или не заканчивающиеся петель зависят от платформы.» Может ли это быть зависимой от платформы ситуацией (GeForce GT 640)? По мере развития шейдерного кода максимальная длина цикла for изменилась (больше кода -> макс макс), что привело меня к подозрению, что это имеет какое-то отношение к разворачиванию цикла. Может ли кто-нибудь дать мне больше информации по этой проблеме? (Сообщите мне, если вам нужно больше кода/описания.)

+0

Убедитесь, что вы не превысили 'GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS'. Спецификация (GL 4.5) гарантирует минимум 1024 для этого предела. – derhass

ответ

2

Одна из возможных причин отказа в ссылке программ, содержащих геометрические шейдеры, как ограничение GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS. Раздел 11.3.4.5 «Геометрия Shader Выходы» из OpenGL 4.5 core profile specifiaction состояний (курсив мой):

Есть два зависящие от реализации ограничения по стоимости GEOMETRY_VERTICES_OUT; он не может превышать значение MAX_GEOMETRY_OUTPUT_VERTICES, а произведение общего количества вершин и сумма всех компонентов всех активных выходных переменных не должны превышать значение MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS. LinkProgram будет терпеть неудачу, если он определит , что общий предел компонентов будет нарушен.

ГЛ гарантирует, что этот предел Toal компонента составляет по меньшей мере 1024.

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

Если я увеличиваю длину, то получаю сообщение об ошибке (с пустым журналом).

Спецификация не требует каких-либо сообщений компоновщика или компилятора вообще. Однако Nvidia обычно предоставляет неплохие сообщения журнала. Если вы можете воспроизвести сценарий «отказ канала без журнала» в самой последней версии драйвера, возможно, стоит указать отчет об ошибке.

+2

Я думаю, что цитата относится к неправильной константе. – AbleArcher

+1

@ thethuthinnang: Вы были правы, я случайно привел неправильный абзац. Я исправил свой ответ. – derhass

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