Проблемы смешивания текстур OpenGL - PullRequest
3 голосов
/ 29 марта 2011

Я создаю 2-мерное приложение для iPad с использованием OpenGL ES и имею некоторые проблемы с рисованием прозрачных изображений.

Я использую изображения png-24 с полной прозрачностью.Я также меняю цвет некоторых текстур, которые являются белыми, а некоторые области прозрачными или полупрозрачными.Все это прекрасно работает.

Когда я пытаюсь установить альфа-значение одной из этих текстур, она работает не совсем правильно.Цвета слишком насыщенные, и если значение альфа = 0, у меня остается белое, а не прозрачное изображение на светло-сером фоне.Когда такое прозрачное изображение находится над темным изображением, темное изображение приобретает цвет, аналогичный цвету прозрачного изображения.

Я пробовал множество комбинаций параметров glTexEnvi и glBlendFunc безуспех.

Я не очень разбираюсь в OpenGL, поэтому, если у кого-то есть какие-либо предложения, это было бы здорово.Дайте мне знать, если есть какие-либо подробности, которые могли бы помочь.

Спасибо.


Вот инициализация OpenGL

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glDisable(GL_DEPTH_TEST);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_BLEND);

Ответы [ 4 ]

4 голосов
/ 29 марта 2011

Похоже, вы сказали OpenGL, что ваша текстура предварительно умножена на альфа, но на самом деле это не так.

Какие параметры вы используете для glBlendFunc?

Более подробное объяснение предумноженная альфа

2 голосов
/ 31 марта 2011

Спасибо за всеобщее мнение.Я думаю, что нашел решение.

Проблема состояла в том, что текстуры имели предварительно умноженное альфа, но полигоны, к которым применяются текстуры, не сделали.С glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA); и glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); все, что мне нужно было сделать, - это вручную умножить значения цвета R, G и B полигонов на альфа-значение, так что все по существу использует предварительно умноженную альфа и рендерится последовательно.

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

wooo

1 голос
/ 30 марта 2011
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ALPHA);

Это недействительно, вы проверяете ошибки GL?Проверьте справочную страницу glTexEnv, чтобы увидеть действительные значения:

http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml

GL_ALPHA не является функцией текстуры, допустимыми функциями текстуры являются GL_ADD, GL_MODULATE, GL_DECAL, GL_BLEND, GL_REPLACE и GL_COMBINE.

Возможно, вы захотите заменить этот GL_ALPHA на GL_MODULATE, чтобы вы могли контролировать альфа текстуры с цветом вершины (glColor).Этот режим умножает текстуру на цвет вершины.

0 голосов
/ 29 марта 2011

Скорее всего, если вы используете 24-битный PNG, у вас не будет альфа-канала.Попробуйте конвертировать в 32-битный PNG и редактировать альфа-канал.В качестве альтернативы вы можете преобразовать из 24-битного в 32-битный режим самостоятельно и сгенерировать альфа-канал из данных изображения (например, с помощью хрома-ключа).

Затем используйте glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); или glBlendFunc(GL_SRC_ALPHA, GL_ONE);, если вы хотите аддитивное смешивание.

...