2017-02-20 3 views
1

Для спецификации OpenGL требуется, чтобы фреймбуфер поддерживал не менее 8 цветных вложений. Теперь OpenGL использует константы времени компиляции (по крайней мере, в моей системе), для таких вещей, как GL_COLOR_ATTACHMENTi и GL_DEPTH_ATTACHMENT, приложение следует за 32 единицами после GL_COLOR_ATTACHMENT0. Разве это не означает, что независимо от того, насколько мудрено аппаратное обеспечение, никогда не будет возможно использовать более 32 цветных вложений? Чтобы уточнить, это компилируется отлично с GLEW на Ubuntu 16.04:Является ли количество вложений цветов ограниченным API

static_assert(GL_COLOR_ATTACHMENT0 + 32==GL_DEPTH_ATTACHMENT,""); 

и так как это static_assert, это будет справедливо для любой конфигурации аппаратных средств (если установщик драйвера не изменять файлы заголовков, что приведет к непереносимой двоичные файлы). Разделять функции для разных классов привязки было бы лучше, поскольку это устраняет возможность сталкивающихся констант?

ответ

2

Важно отметить разницу в языке спецификаций. glActiveTexture говорит об этом параметре:

Ошибка INVALID_ENUM, если указана недопустимая текстура. Текстура является символической константой формы TEXTURE i, указывая, что текстурный блок i должен быть изменен. Каждый TEXTURE я придерживается ТЕКСТУРЫ я = TEXTURE0 + я, где я находится в диапазоне от нуля до К-1, а к этому значение MAX_COMBINED_TEXTURE_IMAGE_UNITS

Этот текст явно позволяет для вычисления значения перечисления, объясняя, как это сделать и каковы пределы.

Сравните это с тем, что он говорит о glFramebufferTexture:

ошибка INVALID_ENUM генерируется, если вложение не один из вложений в таблице 9.2 и приложение не COLOR_ATTACHMENT m где m больше или равно значению MAX_COLOR_ATTACHMENTS.

Это похоже. Но учтите, что у него нет языка о значение этих перечислений. В этом описании нет ничего о COLOR_ATTACHMENT m = COLOR_ATTACHMENT0 + m.

Как таковое, запрещено использовать любое значение, отличное от указанных конкретных перечислений. Теперь да, спецификация действительно гарантирует в другом месте что COLOR_ATTACHMENT m = COLOR_ATTACHMENT0 + m. Но поскольку гарантия не находится в этом разделе, этот раздел явно запрещает использование любого значения, отличного от фактического счетчика. Независимо от того, как вы его вычисляете, результат должен быть фактическим счетчиком.

Чтобы ответить на ваш вопрос, в настоящее время имеется только 32 цветных вложения. Следовательно, MAX_COLOR_ATTACHMENT имеет эффективное максимальное значение 32.

+1

* Нет ничего о COLOR_ATTACHMENTm = COLOR_ATTACHMENT0 + m. * Ух ... нет, есть. Проверьте спецификацию 4.5, стр. 288, §9.2: * Каждый 'COLOR_ATTACHMENTi' придерживается' COLOR_ATTACHMENTi = COLOR_ATTACHMENT0 + i' * – peppe

+0

@peppe: достаточно. Но сама функция * * не говорит, что она может принимать значения, отличные от этих счетчиков. Напротив, 'glActiveTexture' * явно * позволяет вам предоставлять значения, которые не являются фактическими счетчиками. –

0

В OpenGL 4.5 spec состояния в разделе 9.2:

... точками крепления фреймбуфера имени COLOR_ATTACHMENT0 через COLOR_ATTACHMENTn. Каждый COLOR_ATTACHMENTi придерживается COLOR_ATTACHMENTi = COLOR_ATTACHMENT0 + i

и в сноске

файлы заголовков определяют маркеры для COLOR_ATTACHMENTi I в диапазоне [0, 31]. Большинство реализаций поддерживают менее 32 цветных вложений, и это ошибка INVALID_OPERATION для передачи неподдерживаемого имени вложения для команды, принимающей имена вложений цветов.

Моя интерпретация этого в том, что она (при условии, что оборудование поддерживает его) прекрасно использовать COLOR_ATTACHMENT0 + 32 и так далее, чтобы рассмотреть более 32 точек крепления. Таким образом, нет реального ограничения поддерживаемых цветовых вложений, просто константы не определяются напрямую. Почему он был спроектирован таким образом, на него могут отвечать только люди из группы хронос.

+1

Моя точка зрения заключается в том, что GL_COLOR_ATTACHMENT0 + 32 == GL_DEPTH_ATTACHMENT – user877329

+0

Да, вы правы с этим. – BDL

+2

Это «сложнее». Значения этих определений определяются самим Khronos на многих платформах, см. «Glext.h» [здесь] (https://www.khronos.org/registry/OpenGL/index_gl.php) и [Руководство по внедрению API Khronos] (https://www.khronos.org/registry/implementers_guide.html) для полной справки. Там * может * быть более 32 привязанностей в будущем, если перечислители меняются (это перерыв ABI, которого никто никогда не хочет). Есть ли какая-либо потребность в скором времени для более чем 32 цветных вложений? – peppe

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