在OpenGL ES中,如何加载具有透明像素的纹理?

24

如何使显示正确?一个例子是在一个矩形中放置一个圆形球,并能够在背景中看到另一种纹理。

编辑:目前,当我加载纹理时,源图像中的透明像素会显示为黑色。

2个回答

31

对于 iPhone 和 N95,这个方法可行:

如果你正在从原始数据中加载纹理,将内部格式和源格式设置为 GL_RGBA。

glTexImage2D(GL_TEXTURE_2D, 0, 
    GL_RGBA,
    textureWidth,
    textureHeight, 
    0, 
    GL_RGBA,
    GL_UNSIGNED_BYTE,
    pointerToPixels);

在渲染时,启用alpha混合:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

可以,谢谢!接下来,我该如何增加纹理的透明度呢? - Dimitris
2
使用颜色调制。 glTexEnvx(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); 然后将颜色的alpha分量设置为所需值。 glColor4f(255,255,255,alpha); - Virne

13

@Virne 提供的答案是正确的,而我成功地在 Android 设备上进行了一些小修改后使用它。我使用的 myImage 对象是一个带有透明度的标准 .png 图像。

我使用以下代码创建了纹理:

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, myImage, 0);

和Virne一样,我在渲染时启用了Alpha混合:

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);

如果您在使用texImage2d设置位图之前对其进行解码,请不要忘记指定它是ARGB位图: BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inPreferredConfig = Bitmap.Config.ARGB_8888;Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.bitmap, opts); - jonathanrz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接