Где хранить атрибуты VAO?

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

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

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

vbo = [1,1,1,1]

Тогда эти данные действительно могут работать с этими двумя объявлениями вершин шейдера:

in float x;
in float y;

or

in vec2 position;

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

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

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

Это безумие? Есть ли в этом принципиально очевидные недостатки?


person glopes    schedule 06.04.2016    source источник
comment
Более того, вы можете фактически вывести спецификацию VAO прямо из кода шейдера Нет, вы не можете. Можно вывести общий тип (с плавающей запятой, целочисленное, двойное), но особенности привязаны к данным. Беззнаковые байты или короткие байты могут быть преобразованы в числа с плавающей запятой либо с помощью нормализации, либо просто приведения. Целые числа могут подаваться из байтов, коротких или целых чисел. И так далее.   -  person Nicol Bolas    schedule 06.04.2016
comment
Конечно, извините за то, что не ясно выразился. В контексте быстрого прототипирования я могу сделать дополнительные предположения, которые не верны для более общего случая. В этом случае я был готов предположить, что все данные VBO являются плавающими. В любом случае, я обнаружил, что то, что я хотел, на самом деле может потребовать кэширования одного VAO для каждого VBO, поскольку точки привязки должны быть установлены один раз для каждого буфера. Облом ...   -  person glopes    schedule 06.04.2016


Ответы (1)


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

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

person Andon M. Coleman    schedule 06.04.2016