-2

1 我们可以在 Global 进行 alpha 测试吗?

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_EQUAL, 0.7);

使用这两个函数我们可以绘制纹理并显示 alpha >= 0.7 的图像。我的问题是,如果我绘制 2 个纹理,它们的某些部分重叠,它们的 alpha 总和为 0.7,如何显示这部分?


2 如何更高效地绘制位图

关于问题1,我在OpenGL中尝试了一些功能,并没有实现。所以我尝试另一种方式。我设置了一个map[512][512]. 我首先在这张地图上绘制所有纹理并自己积累 alpha。如果像素 alpha >= 0.7,我将其设置为 color ,否则我将其设置为白色。最后,我将整个地图绘制为窗口的纹理。使用这种方法,我可以实现在全局进行 alpha 测试。但它非常非常慢。

(此方法来自 Stackoverflow 的 Bartek Banachewicz)

这是我的功能:

  1. 初始化map[512][512]全部设置为零

  2. 在这张地图上画出所有的东西,并积累阿尔法

  3. 循环地图上的每个像素,根据那里的alpha设置它们的颜色

  4. 用于glTexImage2D()生成纹理(我认为这可能很慢)

  5. 使用glTexCoord2fglVertex3f在窗口上绘制它。

使用这种方法,我画了大约 100 个东西,它变得非常慢(大约 20 FPS)

我可以做些什么来优化这个方法或取得其他成就吗?

4

1 回答 1

2

我的问题是,如果我绘制 2 个纹理,它们的某些部分重叠,它们的 alpha 总和为 0.7,如何显示这部分?

首先,一些术语:

您根本无法绘制纹理。您只能绘制三角形,这可能涉及将一个或多个纹理映射到它们。

如果您将两个纹理都映射到三角形,那么您对它们的 alpha 所做的操作取决于您的着色器(或者如果您不使用着色器,则取决于您的glTexEnv设置)。如果您分别绘制它们,那么您不会绘制 2 个纹理。您正在绘制一个纹理,然后是另一个纹理。

除非您使用混合模式,否则第一个纹理绘制的内容不会影响第二个。或者第三个。

如何更高效地绘制位图

一般来说,你不会。有一些方法可以提高图像数据的传输效率(以像素缓冲区对象为中心,以进行异步传输和缓冲区流技术),但如果您所做的只是对图像进行 blitting,那么正确的方法不是每帧都创建纹理.

您要做的是将您计划使用的所有图像提供给 OpenGL,然后使用纹理映射的三角形(四边形)将它们直接绘制到屏幕上。这就是在大多数执行 2D 位图的应用程序中的完成方式。

于 2012-08-29T12:01:51.033 回答