iPhone открывает альфа-смешение. У меня черный цвет по краю - PullRequest
7 голосов
/ 23 января 2011

Я занимаюсь разработкой игры для iPhone. У меня есть исходное изображение ниже, чтобы нарисовать его на фоне. Исходное изображение имеет альфа 0x00 и градацию по краю, а альфа фона - 0xff. Когда я рисую исходное изображение на фоне, у меня черный цвет, как вы могли видеть изображение результата. Я использую OpenGL ES glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) метод. Я изменил всевозможные аргументы, но каждый раз его не трогали.

Почему у меня черный цвет по краям исходного изображения? В чем проблема? Разве не все игры в iphone используют градацию?

Нужно ли создавать исходное изображение без градации?

Кто-нибудь знает решение?

Исходное изображение:

alt text

Результат изображения:

alt text

Ответы [ 3 ]

14 голосов
/ 23 января 2011

Есть ли у вашего изображения предварительно умноженная альфа? Тогда вы должны использовать

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

Здесь - некоторые объяснения того, что это такое.

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

0 голосов
/ 03 июня 2013

Это может произойти, если вы неправильно настроили свой glTexParameteri для фильтров минимизации и увеличения, а также метод зажима.См. Комментарий Адама Редвуда здесь .Обратите внимание, что проблемы со степенью двух текстур, границ текстур и т. Д. Также могут появиться в игре.

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
0 голосов
/ 23 января 2011

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

...