Проблемы с прозрачностью / смешиванием с OpenGL ES / iPhone - PullRequest
0 голосов
/ 10 сентября 2009

У меня есть простая частица размером 16x16, которая превращается из непрозрачной в прозрачную. К сожалению, это выглядит по-другому в моем порте iPhone, и я не могу видеть, где различия в коде. Большая часть кода по сути одинакова.

Я загрузил изображение на здесь , чтобы показать проблему

Частица слева - неправильно отображенная версия iPhone, а справа - как она выглядит на Mac и Windows. Это просто RGBA .png файл.

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

Чтобы быть точным, мой код загрузки текстуры на iPhone выглядит следующим образом


GLuint TextureLoader::LoadTexture(const char *path)
{
    NSString *macPath = [NSString stringWithCString:path length:strlen(path)]; 
    GLuint texture = 0;

    CGImageRef textureImage = [UIImage imageNamed:macPath].CGImage;
    if (textureImage == nil)
    {
        NSLog(@"Failed to load texture image");
        return 0;
    }

    NSInteger texWidth = CGImageGetWidth(textureImage);
        NSInteger texHeight = CGImageGetHeight(textureImage);

    GLubyte *textureData = new GLubyte[texWidth * texHeight * 4];
    memset(textureData, 0, texWidth * texHeight * 4);

    CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast);
    CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage);

    CGContextRelease(textureContext);

    //Make a texture ID, bind it, create it
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

    delete[] textureData;

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    return texture;
}

Используемая мной функция наложения: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

Приветствие.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2009

Называйте меня наивным, но, поскольку предварительное умножение изображения требует (a r, a g, a * b, a), я решил, что просто разделю значения rgb на a.

Конечно, как только значение альфа больше, чем компоненты r, g, b, текстура частицы становится черной. Ну что ж. Если я не могу найти загрузчик изображений, отличный от того, что был выше, я просто сделаю все компоненты rgb 0xff (белый). Это хорошее временное решение для меня, потому что я либо нуждаюсь в белой частице, либо просто окрашиваю ее в приложении. Позже я мог бы просто сделать необработанные файлы rgba и прочитать их, потому что это в основном для очень маленьких 16x16 и более мелких текстур частиц.

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

0 голосов
/ 10 сентября 2009

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

вы можете использовать

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

...