2014-12-20 6 views
1

Можно ли эмулировать завершенный контур фиксированной функции с помощью шейдеров на лету? По лету означает не переписывать фиксированный функциональный код для использования шейдеров, а как вид промежуточного драйвера, который получает вызовы с фиксированной функцией GLES (возможно, кэширует его для полного одного кадра, поскольку нет прямого перехода от одного к одному из фиксированного в программируемый конвейер) и выдает эквивалентные вызовы GLES2.0.Перевод OpeGLES1.1 конвейера с фиксированной функцией на программируемый конвейер на лету

И даже если это возможно, то сколько будет работы на самом деле?

+0

Я читал, что что-то подобное происходит на некоторых устройствах Android, так что им не нужно поддерживать две разные версии OpenGl. –

ответ

0

Для большинства ES 1.1 это выглядит довольно просто. Все типичные фиксированные функции, такие как преобразования, источники света и материалы, преобразуются непосредственно в шейдерный код.

Для полной замены вам, очевидно, придется реализовать всю функциональность. Из-за перехода на точки входа ES 1.1 я заметил несколько элементов, которые не будут напрямую переводить на ES 2.0, где последний из них выглядит особенно проблематичным:

  • Произвольные обтравочные плоскости. Это не доступно в ES 2.0, но не очень сложно эмулировать в шейдерах, вычисляя расстояние в вершинном шейдере, а затем отбрасывая обрезанные фрагменты в шейдере фрагмента.
  • ES 1.1 имеет нечто, называемое «текстуры палитры». По моему мнению, в ES 2.0 выглядит несколько больно, но возможно. Вам, вероятно, понадобятся две текстуры: одна для индексов и одна для палитры с двумя уровнями выборки в шейдере фрагментов.
  • ES 1.1 поддерживает логические операции (glLogicOp) как часть операций над фрагментами, которые выполняются после шейдера фрагмента. ES 2.0 этого не имеет, и я не могу придумать хороший способ его репликации. Единственное, что приходит на ум - это визуализировать, считывать результат, выполнять логическую операцию на CPU и затем визуализировать полученный образ. И вам придется делать это каждый раз, когда операция будет изменена.
+0

С точки зрения функциональности я понимаю, что есть определенные функции API, которые не являются напрямую переводимыми, но мой вопрос заключается в том, что вы принимаете поток GLES1.1 и конвертируете в поток GLES2.x «на лету», фактически не изменяя приложение для использования GLES2.x от GLES1.1. – Divick

+0

Конечно, вот что я ответил. Когда я говорю о «переходе к шейдерному коду», это означает, что вы пишете код для перевода состояния ES 1.1 в шейдерный код, а не на то, что человеку придется писать шейдерный код. Я могу попытаться повторить ответ позже, чтобы сделать это более ясным. –

+0

Я наткнулся на аналогичный вопрос http://stackoverflow.com/questions/18806175/opengl-fixed-pipeline-shader-defaults-mimic-fixed-pipeline-with-shaders и, глядя на комментарии по этому вопросу, кажется, что имитирующий контур фиксированной функции с использованием шейдеров, может оказаться невозможным для всех видов состояний, которые могут быть в конвейере фиксированной функции. – Divick