0

我正在开发 2D 图形程序,它使用适用于 Android 2.2 及更高版本的 OpenGL。

通常,当半透明的纹理堆积起来时,它会变得像留下的图像。我想先堆积一个纹理,让它像图片一样透明。用Canvas把图片堆起来做成纹理的方式效率低下。OpenGL API有什么办法吗?

在此处输入图像描述

4

1 回答 1

0

这只是一个想法,但可能值得尝试:您可能可以在不先混合的情况下绘制前景元素,然后使用“glBlendFuncSeparate”来绘制背景。前景部分应该按照描述绘制你的元素,然后在混合函数中你仍然可以控制你需要多少透明度来将它与背景混合。坏消息是背景是否有更多的元素要绘制。

通常,您应该使用带有绑定纹理的帧缓冲区对象来绘制前景元素。然后在场景中使用绑定的纹理:

(您将必须找到为 Android 替换此功能的方法)

    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resolution, resolution, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

这将创建一个画布,您可以在主场景中绘制任何内容,并且可以重用绑定的纹理。请注意,“分辨率”可能需要为 2 的幂。此外,您还需要在绘制之前设置矩阵和视口。

于 2012-12-04T08:25:48.703 回答