Прозрачная текстура png в cocos2d с использованием opengl iphone - PullRequest
0 голосов
/ 25 августа 2011

Я создаю полигон, заполненный текстурой, используя opengl в фреймворке cocos2d.Я использовал PRKit ( link ) и изменил метод рисования с помощью кода, показанного ниже.

glBlendFunc(GL_ONE, GL_ZERO);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glBindTexture(GL_TEXTURE_2D, self.texture.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glVertexPointer(2, GL_FLOAT, 0, polyTriangulatedPoints);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates);
glDrawArrays(GL_TRIANGLES, 0, trianglePointCount);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Когда я использую прозрачную PNG в качестве текстуры, я получаю немного странный результат.Прозрачная область не черная, а случайные цвета с черным.Вот вывод, который я получаю с помощью приведенного выше кода.

transparent png

Мне пришлось сохранить glBlendFunc (GL_ONE, GL_ZERO), что аналогично отключению смешивания.Если я этого не сделаю, мой фоновый слой в cocos2d будет добавлен с моим изображением текстуры, что приведет к очень яркой текстуре.Чтобы добавить больше информации, я установил режим текстуры, чтобы все изображения загружались со следующим.

glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, ширина, высота, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

Мой вопрос заключается в том, почему я вижу подобные виды случайных цветов в прозрачной области иКакие способы решить эту проблему?У меня такое чувство, что я, должно быть, делаю что-то не так, поскольку я новичок в opengl.

1 Ответ

2 голосов
/ 26 августа 2011

Если у вас есть текстура с полностью непрозрачным / полностью прозрачным пикселем (только альфа = 1,0 или 0,0), вы можете оставить GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA для сохранения прозрачности.

В противном случае вы можете использовать альфа-тест с GL_GREATER,0.0 (или сбросьте ключевое слово в фрагментном шейдере, если вы используете opengl es 2.0).

Но на ios альфа-тест менее эффективен, чем альфа-смешение.

...