iPhone OpenGL纹理不完全透明
我尝试在球体上绘制透明纹理,但透明区域并非完全透明。一片鲜艳的灰色残存。我尝试加载Photoshop生成的PNG,然后使用以下代码在球体上绘制它: 加载纹理的代码:iPhone OpenGL纹理不完全透明,iphone,opengl-es,transparent,Iphone,Opengl Es,Transparent,我尝试在球体上绘制透明纹理,但透明区域并非完全透明。一片鲜艳的灰色残存。我尝试加载Photoshop生成的PNG,然后使用以下代码在球体上绘制它: 加载纹理的代码: - (void) loadPNGTexture: (int)index Name: (NSString*) name{ CGImageRef imageRef = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",name]].CGImage; GLs
- (void) loadPNGTexture: (int)index Name: (NSString*) name{
CGImageRef imageRef = [UIImage imageNamed:[NSString stringWithFormat:@"%@.png",name]].CGImage;
GLsizei width = CGImageGetWidth(imageRef);
GLsizei height = CGImageGetHeight(imageRef);
GLubyte * data = malloc(width * 4 * height);
if (!data)
NSLog(@"error allocating memory for texture loading!");
else {
NSLog(@"Memory allocated for %@", name);
}
NSLog(@"Width : %d, Height :%d",width,height);
CGContextRef cg_context = CGBitmapContextCreate(data, width, height, 8, 4 * width, CGImageGetColorSpace(imageRef), kCGImageAlphaPremultipliedLast);//kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(cg_context, 0, height);
CGContextScaleCTM(cg_context, 1, -1);
CGContextDrawImage(cg_context, CGRectMake(0, 0, width, height), imageRef);
CGContextRelease(cg_context);
CGContextSetBlendMode(cg_context, kCGBlendModeCopy); //kCGBlendModeCopy);
glGenTextures(2, m_texture[index]);
glBindTexture(GL_TEXTURE_2D, m_texture[index][0]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
free(data);
}
绘制云:
glPushMatrix();
glTranslatef(0, 0, 3 );
glScalef(3.1, 3.1, 3.1);
glRotatef(-1, 0, 0, 1);
glRotatef(90, -1, 0, 0);
glDisable(GL_LIGHTING);
//Load Texture for left side of globe
glBindTexture(GL_TEXTURE_2D, m_texture[CLOUD_TEXTURE][0]);
glVertexPointer(3, GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].vertex);
glNormalPointer(GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].normal);
glTexCoordPointer(2, GL_FLOAT, sizeof(TexturedVertexData3D), &VertexData[0].texCoord);
// draw the sphere
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_COPY);
glDrawArrays(GL_TRIANGLES, 0, 11520);
glEnable(GL_LIGHTING);
glPopMatrix();
代码中最突出的是一行:
glBlendFunc(GL_SRC_ALPHA, GL_COPY);
第二个参数()不适用于glBlendFunc
。
你可能想把它改成
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
向我们展示代码的(相关部分)。理想情况下,我们可以自己尝试一些最小的东西。你确定纹理具有透明度/alpha通道吗?这感觉像是一个愚蠢的问题:如果结果完全透明,它不是不可见的吗?你是否激活了
glEnable(GL_照明)
?我相信这会影响或添加“材质”着色,请参见glMaterial(…)
@MrMusic:不会,因为此球体内还有另一个球体。@ePetel请详细描述。