2009-09-09 2 views
0

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

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

частицей слева является неправильно обработанной версией iPhone и справа, как он появляется на Mac и Windows. Это простой файл RGBA .png.

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

Просто быть тщательным, мой Texture код загрузки на 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);

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

Cheers.

+0

Является ли изображение слева визуализированным симулятором, или это на самом аппаратном обеспечении? –

ответ

0

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

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

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

+0

Я пробовал glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA), и хотя кажется, что он работает нормально, когда есть только одна частица, как только много перекрывающихся, цвет становится довольно интенсивным/ярким. Я рассмотрю эту «премультипликативную альфу». – user156848

0

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

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

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

Смежные вопросы