2016-04-06 3 views
1

Я разрабатываю небольшой слой абстракции OpenGL для быстрого прототипирования рендеринга графического процессора. Сейчас я разрабатываю объектную модель для выделения объектов буфера из кода визуализации шейдеров.Где хранить атрибуты VAO?

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

Одна вещь, которая немного терна на моем пути прямо сейчас - это VAO. Например, если мои данные вершина выглядит следующим образом:

ВБО = [1,1,1,1]

Затем эти данные могут на самом деле работать с этими декларациями вершинных два шейдера:

in float x; 
in float y; 

или

in vec2 position; 

Проблема в том, что привязка VAO должна быть разной. Мое заключение заключается в том, что информация VAO более тесно связана с кодом шейдера, чем с фактическими данными объекта.

Кроме того, вы можете «вывести» спецификацию VAO прямо из шейдерного кода (т. Е. VAO - это своего рода семантика, а семантика указана в шейдерном коде).

Поэтому я думал, что вместо хранения VAO в объекте данных я мог бы фактически вывести его автоматически и сохранить его в объекте шейдера. Затем каждый раз, когда я рисую, я связываю VBO с объектом данных и VAO из шейдера. Таким образом, я мог бы работать с тем же VBO с разными шейдерами.

Является ли это сумасшедшим? Есть ли принципиально очевидные недостатки?

+0

"* Кроме того, вы можете« вывести »спецификацию VAO прямо из кода шейдера *« Нет, вы не можете. Общий тип может быть выведен (float, integer, double), но специфика связана с данными. Неподписанные байты или шорты могут быть преобразованы в поплавки, либо путем нормализации, либо просто для кастинга. Целые числа могут передаваться из байтов, шорт или int. И так далее. –

+0

Конечно, извините за то, что я не поняла. В контексте быстрого прототипирования я могу сделать дополнительные предположения, которые неверны для более общего случая. В этом случае я был готов предположить, что все данные VBO являются плавающими. В любом случае, я выясню, что то, что я хочу, может потребовать кэширования одного VAO для каждого VBO, поскольку точки привязки должны быть установлены один раз для каждого буфера. Облом ... – glopes

ответ

4

Общая развязка, о которой вы говорите, уже возможна в последних версиях GL через расширения Vertex Attrib Binding и Program Interface Query.

Следует отметить, что объем работы, необходимый для реализации этой функции, примечателен, но вы наверняка не заперты в спецификации жестких вершин в любой версии GL с момента появления общих атрибутов вершин (ARB VP1). Поскольку вы отметили этот GL4, вы можете найти два основных расширения, упомянутые выше (оба из которых были явными в GL 4.3) полезны.

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

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