Как я могу определить цвета на поверхность, когда использование индексировало массивы вершины в OpenGL 3.x?

Как 22-летний пользователь Visual Studio я люблю дразнить своих электронных-macs коллег использования. То, когда они видят, как изящный VS с Визуальным Помогает X, они немедленно завистливы, и вещи струи как, "но это находится в Windows", и "Bill Gates является идиотом".

я могу с руками на основу, говорят, что я пишу код несколько раз быстрее, чем мои электронные-macs дубликаты владения.

27
задан Wonko 2 November 2009 в 23:39
поделиться

3 ответа

Сначала фактический ответ:
См. Ответ Гоза. Сохраните 24 отдельные вершины.

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

Вы ошибочно полагаете, что использование устаревших API-интерфейсов поможет вам решить проблему. Это не тот случай. OpenGL обрабатывает (и всегда обрабатывал) каждую вершину как уникальный набор атрибутов. Если вы внимательно прочитаете исходную спецификацию, вы заметите, что при выполнении:

glNormal()
glVertex()
glVertex()
glVertex()

В спецификации четко указано, что glNormal устанавливает текущее нормальное состояние , и что glVertex вызывает новую вершину, попутно копируя все текущее состояние , включая текущее нормальное состояние . То есть, даже если вы передали только один Нормальный, GL по-прежнему видит 3.

GL, следовательно, не имеет атрибутов "на лицо".

Кроме того, вы интерпретирует ваше смещение как указатель (и, скорее всего, выйдет из строя).

То, что вы пытались сделать, установить массив индексов для каждого атрибута вершины, не поддерживается GL. Позвольте мне повторить это: у вас есть только 1 индексный массив на отрисовку .

Некоторые дополнительные лакомые кусочки для прилагаемой истории:

glVertex - это немного неправильное название. Он определяет только позицию вершины . Но, и это то, от чего он получил свое название, он также вызывает передачу вершины в GL. Чтобы API был полностью чистым, вы могли представить, что вам нужно сделать 2 вызова:

// not valid code
glPosition(1,2,3); // specifies the current vertex position
glProvoke(); // pass the current vertex to GL

Однако, когда GL был впервые указан, Position всегда требовалась, поэтому объединение этих 2 для создания вершины имело смысл (хотя бы для уменьшения Количество вызовов API).

Перенесемся на vertex_program_arb : Попытка уйти от модели фиксированных функций, оставаясь при этом совместимой, означала, что особая природа glVertex должна быть сохранена. Это было достигнуто путем создания провоцирующего атрибута вершины 0 и синонима glVertex.

Перенесемся в GL3.2: модель начала / конца исчезла, и вся эта спецификация того, что вызывает вершину может наконец уйти вместе с управлением текущим состоянием . То же самое и со всеми семантическими API (glVertex *, glNormal * ...), поскольку все входные данные теперь являются просто атрибутами вершин.

и вся эта спецификация того, что провоцирует вершину, может окончательно уйти вместе с управлением текущим состоянием . То же самое и со всеми семантическими API (glVertex *, glNormal * ...), поскольку все входные данные теперь являются просто атрибутами вершин.

и вся эта спецификация того, что провоцирует вершину, может окончательно уйти вместе с управлением текущим состоянием . То же самое и со всеми семантическими API (glVertex *, glNormal * ...), поскольку все входные данные теперь являются просто атрибутами вершин.

32
ответ дан 28 November 2019 в 04:15
поделиться

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

6
ответ дан 28 November 2019 в 04:15
поделиться

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

OpenGL draw calls.

Я опубликовал это изображение на условиях Creative Commons BY-SA, как указано в этом источнике.

41
ответ дан 28 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: