我将纹理加载到具有各种Alpha值的RGBA格式的内存中。在OpenGL中绘制纹理,同时忽略Alpha通道
的图像加载为这样:
GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
self.texNum = texture;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);
我想知道,这样的图像中的alpha通道被视为全1和纹理绘制像一个RGB图像,我可以怎样得出这个纹理。
考虑基本图像:
此图像是级数从0到255的α,并且具有在整个255,0,0
的RGB值。然而,如果我与绘制它混合禁用我得到那个看起来像一个形象: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png
当我真正想要的是,像这样的图像: www.ldeo.columbia.edu/~jcoplan/alpha/correct.png
我真的很感谢一些指针,让它完全忽略alpha通道。请注意,我不能只是将图像作为RGB加载,因为我确实需要其他位置的Alpha通道。
编辑:我试图用GL_COMBINE解决我的问题如此:
glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
[self drawTexture];
但仍没有运气,它吸引黑变红仍。
这两个解决方案建议看起来是正确的。查看调试器内存视图中[self.imageData bytes]返回的指针。你期望的价值是什么?你得到的结果表明他们不会是... – 2010-07-08 17:34:56
你使用预乘alpha吗?如果是这样,那么淡入黑色就是纹理的RGB值。你的glBlendFunc是什么? – Alan 2010-07-08 17:38:47
@Alan&brone 看完它们的字节后,这是正确的,图像正在通过XCode优化预倍增,并且字节内部并非我所期望的。 所以答案是我没有正确加载图像。 谢谢! – jcoplan 2010-07-08 18:04:19