如何在开放的gl纹理的alpha中编码发射或镜面reflection信息

我有一个OpenGL纹理与UV地图上。 我已经读过关于使用alpha通道来存储一些其他的值,从而节省了需要从某个地方加载额外的地图。 例如,您可以在alpha中存储高光信息(发光度)或发射贴图,因为您只需要一个浮点数而不使用alpha。

所以我试了一下。 写着色器不是问题。 我已经完成了所有这一部分。 问题就是让我想要的所有4个通道进入纹理。

我有PSD中的所有地图,我把基本地图放在rgb中,排放地图放在a中。 但是,当你保存为png的alpha不是保存(如果你把它添加为一个新的频道),或通过预先将透明度乘以rgb(如果您将地图作为蒙版)来破坏rgb。

显然PNG文件支持透明度,但本身不支持alpha通道。 所以似乎没有办法控制所有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个频道?

我可以使用纹理工具来制作一个PVR ..但是从文档看来,它似乎也采用PNG作为input。

编辑:

首先要清楚这是在iPhone。

这可能是psd的错。 就像我说的,在我可以find的psd(cc 14.2 mac)版本中,有两种方法来设置文档。 一个是手动添加一个新的频道,并粘贴在那里的地图。 它显示为一个红色的覆盖。 第二个是添加一个蒙版,选项点击它并粘贴在那里的阿尔法。 在这种情况下,它显示与阿尔帕作为一个透明的棋盘在阿尔法零区。 当我保存为PNG的alpha选项灰色。

当我把png加载到psd时,它似乎是预乘。 我不能回到我在Photoshop中的完整RGB数据。

是否有一个不同的工具,我可以用来将两个地图合并成一个PNG,将其存储在PNG 32?

TIFF将无法正常工作,因为它不会存储alpha。 也许我在想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); 

当我创build该上下文时,选项是kCGImageAlphaPremultipliedLast

也许我需要尝试glkit loader,但看起来我的png是预乘。

可以创build一个带alpha通道的PNG,但是如果没有预乘function,将无法使用内置iOS API读取该PNG图像。 核心问题是CoreGraphics仅支持预乘alpha。 您还必须小心禁用Xcode对附加到项目文件的PNG的优化,因为它在编译时执行了预乘。 你可以做的是closuresXcode PNG处理后,在自己的libpng副本中编译和链接,然后直接用C语言中的libpng读取文件。 但是,老实说这是浪费时间。 只需保存一个图像的RGB值,另一个灰度值的alpha值为0-255灰度值。 你可以有那些灰度值意味着任何你想要的,你不必担心premult搞砸了。 你的opengl代码只需要从多个纹理读取,而不是一个大问题。