OpenGL: наложение одной текстуры на другую и подавление белого фона

Я начинаю программировать на Iphone opengl ES. У меня две текстуры, первая - фоновая и занимает весь экран. Я печатаю второе изображение поверх первого, но белый фон второго изображения покрывает часть фона. Я хочу, чтобы фон был виден там, где изображение переднего плана не имеет цвета (или не имеет белого цвета). Я не могу понять, как правильно использовать glBlendFunc.

перед печатью второго изображения я использую смешивание со следующим:

glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f (1.0f, 1.0f, 1.0f, 1.0f);

Изображения по адресу: http://www.flickr.com/x/t/0097002/photos/vjv2010/


person user371260    schedule 25.06.2010    source источник
comment
перед рендерингом убедитесь, что вы вызываете glEnable (GL_BLEND). Кроме того, если ваша текстура не является полупрозрачной, вы можете использовать альфа-тест для вырезания пикселей вместо альфа-смешения. Альфа-тест будет быстрее.   -  person SigTerm    schedule 25.06.2010
comment
@SigTerm: Я тоже так думал, но Apple задокументировала, что это может отрицательно сказаться на производительности ... может быть, на iPhone смешивание происходит быстрее?   -  person Stringer    schedule 25.06.2010
comment
@Stringer Bell: Да, смешивание происходит довольно медленно (вы даже можете поставить ПК на колени с чрезмерным альфа-смешиванием), но чтобы использовать альфа-канал, вам нужно либо включить alphaBlend (glEnable (GL_BLEND)), либо включить alphaTest (glEnable ( GL_ALPHA_TEST)). В противном случае альфа-канал не будет иметь никакого эффекта. Если вам не нужны полупрозрачные поверхности, все, что вам может понадобиться, - это альфа-тест. Есть способ имитировать полупрозрачность с помощью alphatest + dithering или glPolygonStripple, но на маленьком экране (iPhone) он обязательно будет выглядеть очень некрасиво.   -  person SigTerm    schedule 25.06.2010
comment
@SigTerm, насчет glPolygonStripple, это не часть OpenGL-ES AFAIK. С другой стороны, у вас есть glSampleCoverage, который можно использовать для подделки прозрачности! khronos.org/opengles/documentation/opengles1_0/html/   -  person Stringer    schedule 26.06.2010


Ответы (1)


Я хочу, чтобы фон был виден там, где изображение переднего плана не имеет цвета (или не имеет белого цвета).

У вас есть два варианта, самый простой - использовать альфа-тестирование и добавить альфа-канал для изображения переднего плана, чтобы каждый белый пиксель (или отсутствие цветовых зон) имел особое значение, скажем, 0,0f и все остальные 1,0f.

Затем при рендеринге переднего плана вы включаете альфа-тестирование с помощью glEnable(GL_ALPHA_TEST) и устанавливаете альфа-функцию с помощью glAlphaFunc(GL_GREATER, 0.5f). Это будет принимать / рисовать только фрагменты с альфа-значением больше 0,5f и отбрасывать / не рисовать все фрагменты с альфа-значением меньше 0,5f.

Второй вариант - использовать смешивание, как и вы, но вам также потребуется добавить дополнительный альфа-канал на передний план и правильно установить glBlendFunc.

Подробнее здесь: http://iphone-3d-programming.labs.oreilly.com/ch06.html

person Stringer    schedule 25.06.2010