ios - Cómo codificar la emisión o información especular en el alfa de una textura gl abierta
opengl-es png (1)
Tengo una textura OpenGL con un mapa UV. He leído sobre el uso del canal alfa para almacenar algún otro valor que ahorra la necesidad de cargar un mapa extra desde algún lugar. Por ejemplo, puede almacenar información especular (brillo) o un mapa de emisión en el alfa ya que solo necesita un flotador para eso y el alfa no se está utilizando.
Así que lo intenté. Escribir el sombreador no es el problema. Tengo toda esa parte resuelta. El problema es simplemente obtener los 4 canales en la textura como yo quiero.
Tengo todos los mapas, así que en PSD puse el mapa base en el rgb y el mapa de emisiones en el a. Pero cuando guarda como png, el alfa no guarda (si lo agrega como un nuevo canal) o lo arruina al premultiplicar la transparencia al rgb (si aplica el mapa como una máscara).
Aparentemente, los archivos PNG admiten transparencia pero no canales alfa per se. Entonces, no parece haber una manera de controlar los 4 canales.
Pero he leído sobre hacer esto. Entonces, ¿qué formato puedo guardar desde PSD que puedo cargar con mi cargador de imágenes en el iPhone?
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:type];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];
¿Este método acepta otros formatos de archivo? ¿Como TIFF que me permitiría controlar los 4 canales?
Podría usar texturetool para hacer un PVR ... pero de los documentos parece que también toma un PNG como entrada.
EDITAR:
Primero, para que quede claro, esto está en el iPhone.
Podría ser la culpa de psd. Como dije, hay dos formas de configurar el documento en mi versión de psd (cc 14.2 mac) que puedo encontrar. Una es agregar manualmente un nuevo canal y pegar los mapas allí. Se muestra como una superposición roja. El segundo es agregar una máscara, haga clic en la opción y pegue el alfa allí. En ese caso, se muestra con la alpa como transparencia con el tablero de ajedrez en las áreas alfa cero. Cuando guardo como png la opción alfa se desvanece.
Y cuando vuelvo a cargar el png en psd, parece estar premultiplicado. No puedo volver a mis datos completos de rgb en photoshop.
¿Hay alguna herramienta diferente que pueda usar para unir los dos mapas en un png que lo almacenará png-32?
TIFF no funcionará porque tampoco almacena alfa. Quizás estaba pensando en TGA.
También noté esto en mi cargador ...
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);
Cuando creo ese contexto, la opción es kCGImageAlphaPremultipliedLast
.
Quizás necesito probar el cargador glkit, pero parece que mi png está premultiplicado.
Es posible crear un archivo PNG con un canal alfa, pero no podrá leer esa imagen PNG utilizando las API integradas de iOS sin una premultiplicación. El problema principal es que CoreGraphics solo admite alpha premultiplicado por razones de rendimiento. También debe tener cuidado de deshabilitar la optimización de PNG de PNG adjunta al archivo de proyecto porque realiza la premultiplicación en tiempo de compilación. Lo que podría hacer es compilar y vincular en su propia copia de libpng después de desactivar el procesamiento Xcode PNG, y luego leer el archivo directamente con libpng en el nivel C. Pero, sinceramente, esto es una pérdida de tiempo. Simplemente guarde una imagen con los valores RGB y otra como escala de grises con los valores alfa como 0-255 valores de escala de grises. Puede hacer que esos valores en escala de grises signifiquen lo que quiera y no tendrá que preocuparse de que el premultultor arruine las cosas. Su código opengl solo necesitará leer de múltiples texturas, no es un gran problema.