【问题标题】:In OpenGL ES, how do I load a texture that has transparent pixels?在 OpenGL ES 中,如何加载具有透明像素的纹理?
【发布时间】:2009-03-04 16:02:55
【问题描述】:

然后显示正确?一个例子是在一个矩形中有一个圆球,同时能够在背景中看到另一个纹理。

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

【问题讨论】:

    标签: opengl-es


    【解决方案1】:

    适用于 iPhone 和 N95:

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

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

    并且在渲染时,启用 alpha blend:

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

    【讨论】:

    • 这行得通,谢谢!作为后续,在此之后我将如何增加纹理透明度?
    • 使用颜色调制。 glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);然后将颜色的 alpha 分量设置为所需的值。 glColor4f(255, 255, 255, alpha);
    【解决方案2】:

    @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;位图位图 = BitmapFactory.decodeResource(context.getResources(), R.drawable.bitmap, opts);
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多