Как закодировать эмиссионную или зеркальную информацию в альфа текстуре открытого гл

У меня есть текстура OpenGL с UV-картой. Я читал об использовании альфа-канала для хранения некоторого другого значения, которое избавляет от необходимости загружать дополнительную карту откуда-то. Например, вы можете хранить зеркальную информацию (блеск) или карту выбросов в альфе, поскольку для этого вам нужен только плавающий элемент, а альфа не используется.

Так я и попробовал. Написание шейдера не проблема. Я все эту часть проработал. Проблема состоит в том, чтобы просто вставить все 4 канала в текстуру, как я хочу.

У меня есть все карты, поэтому в PSD я поместил базовую карту в RGB и карту выбросов в a. Но когда вы сохраняете как png, альфа либо не сохраняет (если вы добавляете его как новый канал), либо удаляет rgb, предварительно умножая прозрачность на rgb (если вы применяете карту в качестве маски).

Очевидно, файлы PNG поддерживают прозрачность, но не альфа-каналы как таковые. Так что, похоже, нет способа контролировать все 4 канала.

Но я читал об этом. Так в каком формате я могу сохранить его из PSD, который я могу загрузить с помощью своего загрузчика изображений в iPhone?

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:type];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];

Этот метод принимает другие форматы файлов? Как TIFF, который позволил бы мне контролировать все 4 канала?

Я мог бы использовать texturetool для создания PVR ... но из документов он также принимает PNG в качестве входных данных.

РЕДАКТИРОВАТЬ:

Прежде всего должно быть ясно, что это в iPhone.

Это может быть вина PSD. Как я уже сказал, в моей версии psd (cc 14.2 mac) есть два способа настройки документа, которые я могу найти. Один из них - добавить новый канал вручную и вставить туда карты. Это проявляется как красное наложение. Второе - добавить маску, выбрать ее и вставить туда альфу. В этом случае он показывает это с alpa в качестве прозрачности с шахматной доской в ​​областях альфа-нуля. Когда я сохраняю как png, альфа-опция не работает.

И когда я загружаю png обратно в psd, он, кажется, предварительно умножается. Я не могу вернуться к своим полным данным RGB в фотошопе.

Есть ли другой инструмент, который я могу использовать, чтобы объединить две карты в PNG, который будет хранить его PNG-32?

TIFF не будет работать, потому что он также не хранит альфа. Может быть, я думал о TGA.

Я также заметил это в моем загрузчике ...

    GLuint width = CGImageGetWidth(image.CGImage);
    GLuint height = CGImageGetHeight(image.CGImage);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    void *imageData = malloc( height * width * 4 );
    CGContextRef thisContext = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );

    if (flipImage)
    {
        CGContextTranslateCTM (thisContext, 0, height);
        CGContextScaleCTM (thisContext, 1.0, -1.0);
    }

    CGColorSpaceRelease( colorSpace );
    CGContextClearRect( thisContext, CGRectMake( 0, 0, width, height ) );
    CGContextDrawImage( thisContext, CGRectMake( 0, 0, width, height ), image.CGImage );

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

    glBindTexture(GL_TEXTURE_2D, textureInfo[texIndex].texture);

Когда я создаю этот контекст, опцияkCGImageAlphaPremultipliedLast.

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

Ответы на вопрос(1)

Ваш ответ на вопрос