Как я могу перевести смесь наложений GLSL в OpenGL ES 1.1? - PullRequest
1 голос
/ 08 января 2011

Ниже приведена реализация алгоритма наложения наложения в GLSL, взятая из языка OpenGL Shading®, третье издание:

19.6.12 Наложение

OVERLAY сначала вычисляет яркость базовой стоимости.

Если значение яркости меньше 0.5, значения blend и base умножаются вместе.

Если значение яркости больше 0,5, выполняется операция на экране.

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

Прерывистость возникает там, где яркость = 0,5 Чтобы обеспечить плавный переход, мы на самом деле делаем линейную смесь два уравнения для яркости в диапазон [0,45,0,55].

float luminance = dot(base, lumCoeff);

if (luminance < 0.45)

    result = 2.0 * blend * base;

else if (luminance > 0.55)

    result = white - 2.0 * (white - blend) * (white - base);

else {

    vec4 result1 = 2.0 * blend * base;
    vec4 result2 = white - 2.0 * (white - blend) * (white - base);
    result = mix(result1, result2, (luminance - 0.45) * 10.0);

}

Как бы я реализовал нечто подобное в OpenGL ES 1.1 (для iPhone 3G) без использования шейдеров? Могу ли я использовать функцию смешивания или комбинирование текстур для реализации этого?

1 Ответ

1 голос
/ 10 января 2011

Для того, чтобы оставить ответ в протоколе и предположить, что вы не можете выполнить дальнейшую оптимизацию, вы можете:

1) Загрузить значение яркости в альфа-канал

Установите объект framebuffer, того же размера, что и исходная текстура. Используйте glColorMask, чтобы включить или отключить запись на разные каналы. Прежде всего, включите красный, зеленый и синий каналы и отключите альфа-канал. Нарисуйте текстуру нормально. Это дублирует информацию о цвете текстуры.

Затем включите альфа-канал и отключите красный, зеленый и синий каналы. Используйте расширение dot3 (которое поддерживается на iPhone с самого начала), чтобы заполнить целевой альфа-канал значениями яркости.

2) Разделить текстуру на три текстуры в зависимости от яркости

Простая схема будет просто разделить на яркость = 0,5 и игнорировать линейное смешение. Если бы вы сделали это, вы могли бы снова использовать объекты кадрового буфера, чтобы разделить текстуру на GPU. На этот раз используйте альфа-функцию (glAlphaFunc и обязательно включите ее), чтобы передать все эти области с альфа-значением больше 0,50 при рисовании на одну текстуру, чтобы передать все эти объекты с альфа-значением меньше 0,50 при рисовании на другую.

Хотя вы можете выполнить только один альфа-тест на пиксель, то есть вы не можете выделить диапазон от 0,45 до 0,55 за один шаг, вы можете сделать это за два шага.

3) Используйте обычные режимы наложения, чтобы объединить две или три текстуры в буфер кадров

При необходимости вы можете отключить систему освещения для смещения и масштабирования альфа-каналов во время рендеринга.


Очевидно, что вы оптимизируете, выполняя те шаги, которые идентичны для каждого розыгрыша, только один раз, при запуске. Что, вероятно, означает постоянное хранение того, что в данный момент является одной текстурой, двумя или тремя.

...