Постоянная непрозрачность с помощью glBlendFunc на iPhone

Какой glBlendFunc мне следует использовать, чтобы гарантировать, что непрозрачность моего рисунка всегда одинакова? Когда я использую glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) и несколько изображений рисуются друг над другом, результат становится все более и более непрозрачным, пока не станет полностью непрозрачным после определенного количества изображений.

Самое близкое, что я пришел, - это использовать glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA), который поддерживает постоянную непрозрачность независимо от того, сколько изображений находится друг над другом, хотя есть небольшое изменение непрозрачности, если изображения перекрывают друг друга.

Есть ли другие состояния рендеринга, которые мне стоит попробовать? Есть другие идеи? Я делаю приложение для рисования для своего ребенка, и я не хочу, чтобы изображения (кисть), которые они рисовали, закрывали фон.

Вот самое близкое, что у меня есть:
http://img43.imageshack.us/img43/5347/img0085f.png

Я хочу, чтобы перекрывающаяся часть кругов была того же цвета и непрозрачности, что и центральная часть круга.

Я использую cocos2d iphone v. 0.99


person jjxtra    schedule 07.03.2010    source источник


Ответы (2)


Нарисуйте (без прозрачности) в буфер рендеринга, затем используйте полученное изображение в качестве текстуры на частично прозрачном квадрате в вашей основной сцене.

Вот метод для OpenGL до RBO, но вы не уверены, поддерживает ли его ваше устройство. Возможно, вам придется преобразовать его для использования RBO.

  • убедитесь, что вы выбрали формат отображения, имеющий хотя бы один буфер AUX
  • glGenTextures для выделения идентификатора текстуры
  • glPushAttrib (GL_COLOR_BUFFER_BIT)
  • glDrawBuffer (AUX0) для прямого рендеринга внеэкранного растрового изображения
  • glReadBuffer (AUX0)
  • glCopyTexSubImage2D, чтобы превратить изображение в текстуру
  • glPopAttrib (GL_COLOR_BUFFER_BIT) для восстановления настройки буфера отрисовки
  • glEnable (Текстура_2D)
  • glBindTexture
  • glBegin (QUADS)
  • glColor (100% RGB, частичная альфа)
  • glTexCoord (четыре раза)
  • glVertex (четыре раза)
  • glEnd

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

person Ben Voigt    schedule 07.03.2010
comment
Есть ли шанс на код? Я не совсем понимаю, что вы имеете в виду. - person jjxtra; 08.03.2010
comment
К сожалению, у меня нет разрешения на публикацию исходного кода, который у меня есть (он использует старую версию OpenGL без объектов renderbuffer, но идея та же), но это почти то же самое, что и двойная буферизация. Я добавлю шаги к своему ответу. - person Ben Voigt; 08.03.2010

В итоге я сделал это:

glAlphaFunc(GL_NOTEQUAL, 0);
[sprite1.texture setAliasTexParameters];
[sprite1 setBlendFunc: (ccBlendFunc) { GL_SRC_ALPHA, GL_ZERO }];

затем, когда я рисую на своем CCRenderTexture, я включаю альфа-тест, посещаю свой спрайт кисти и затем отключаю альфа-тест.

person jjxtra    schedule 07.03.2010