OpenGL 3.0 – Fail?

11 августа на всеобщее обозрение выложили спецификацию долгожданного OpenGL 3.0, и разочаровали почти всё сообщество пользователей GL.

Всякие мечты о новом API, объектной модели, компиляции шейдеров в бинарный код и переработанном GLSL оказались разбиты. В общем, повторилась ситуация, знакомая нам по OpenGL 2.0.

Вместо всего этого, в очередной раз несколько расширений было добавлено в core, обновлён GLSL (до версии 1.3), поменяли некоторые токены. Новый раздел в спецификации – deprecation model. Многие вещи были объявлены устаревшими, и с помощью расширения ARB_create_context можно создать контекст, в котором они не будут работать, и будут выдавать ошибки. Список урезанного функционала:

  • Режим индексного цвета (палитра), включая форматы текстур.
  • Отрисовка с помощью glBegin/glEnd и из массивов, расположенных в системной памяти.
  • Все встроенные вершинные атрибуты и функции по их установке. Теперь поддерживаются только пользовательские аттрибуты.
  • Весь GL state кроме gl_DepthRange и стек матриц трансформаций, а также функции для настройки FFP.
  • Смена толщины линий.
  • Примитивы QUAD, QUAD_STRIP и POLYGON.
  • Режим отображения задних и передних граней не может быть разным.
  • Запись пикселей и растровые операции.
  • Форматы ALPHA LUMINANCE, LUMINANCE ALPHA, и INTENSITY заменены R и RG текстурами.
  • Альфатест.
  • Буфер аккумулятора.
  • Evaluators.
  • Режим выбора.
  • Списки отображения.
  • Стек атрибутов.

Это многое из того, что убрали. А добавили в core следующие расширения:

EXT_gpu_shader4 – возможности Shader Model 4.0. Нативная поддержка int и uint. Получения размера текстуры, обращение к конкретным текселям текстуры, или по обычным координатам, но с целочисленным сдвигом. gl_VertexID на вход вершинного шейдера. Выбор режима интерполяции varying’ов. Geometry shaders сюда не входят.

NV_conditional_render – выполнения отрисовки в зависимости от результата query, который не нужно получать от видеокарты.

Точное управление регионов для мапинга буферов в клиентскую память.

ARB_color_buffer_float, NV_depth_buffer_float, ARB_texture_float, EXT_packed_float и EXT_texture_shared_exponent – различные float форматы текстур, а также 32-битный float буфер глубины.

EXT_framebuffer_object – сколько лет прошло, и его одобрили.

EXT_framebuffer_multisample и EXT_framebuffer_blit – в поддержку предыдущего, рендер в РТ с мультисемплингом, а также ресолв в обычную текстуру.

NV_half_float, ARB_half_float_pixel – 16-ти битные форматы с плавающей точкой для вершинных атрибутов и фреймбуфера.

EXT_texture_integer – целочисленные текстуры.

EXT_texture_array – массивы текстур.

EXT_packed_depth_stencil – формат render buffer с interleaved глубиной и значением стенциля (читать D24S8)

EXT_draw_buffers2 – раздельный режим блендинга для разных таргетов при MRT.

EXT_texture_compression_rgtc – поддержка сжатых форматов для одноканальных и двухканальных текстур.

EXT_transform_feedback – Stream Out из VS.

EXT_framebuffer_sRGB – sRGB текстуры появились в 2.1, а теперь в них можно рисовать.

В GLSL 1.3 добавили функционал из EXT_gpu_shader4, текстурную выборку с пользовательскими градиентами (наконец-то!), функции для работы с целочисленными текстурами. Функции текстурных выборок переименовали: теперь не нужно писать тип текстуры (1D, 2D, 3D, Cube, *Shadow), просто texture(…) и компилятор сам догадается, какая у нас текстура. Встроенных атрибутов больше нет, как нет и GL state (о чём я писал выше). ftransform() убрали, попросили ставить флажок invariant.

Поддержка всего этого возможна только на видеокартах уровня ДХ10, но почему-то многие основные возможности этих видеокарт оказались за бортом. Нету GS, нет инстансинга, нет константных буферов, нельзя читать отдельные семплы multi-sampled текстуры в GLSL. Это всё предложено отдельными расширениями от ARB, кроме чтения из MS текстуры, но и оно может быть добавлено расширением GLSL (возможно от АТИ, у них компилятор не имеет ничего против типа msSampler2D). Вот только ждать этих расширений от некоторых вендоров возможно придётся довольно долго.

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

Интересно, почему не решились выполнить обещанного. Казалось бы, два года разработки и неразглашение информации готовило что-то большое. Комьюнити ожидало достойный ответ ДХ10 как игровому АПИ, но получило лишь очередной апдейт.

Crossposted to null_ptr.livejournal.com