Как закодировать эмиссионную или зеркальную информацию в альфа текстуре открытого гл
У меня есть текстура 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 предварительно умножен.