OpenGL,关于alpha测试和绘制位图效率

时间:2012-08-29 06:39:29

标签: opengl opengl-es

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。如果像素α> = 0.7,我设置它的颜色,如果不是我设置白色。最后,我将整个地图绘制为窗口的纹理。使用这种方法,我可以在全局实现alpha测试。但它非常慢。

(此方法来自于stackoverflow的Bartek Banachewicz)

这是我的功能:

  1. init map[512][512]全部设为零

  2. 在此地图上绘制所有内容,并累积alpha

  3. 循环地图上的每个像素,根据alpha

  4. 设置颜色
  5. 使用glTexImage2D()生成纹理(我觉得这可能很慢)

  6. 使用glTexCoord2fglVertex3f在窗口上绘制此内容。

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

    我可以采取哪些措施来优化此方法或获得其他成就吗?

1 个答案:

答案 0 :(得分:2)

  

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

首先,一些术语:

您无法在所有处绘制纹理。您只能绘制三角形可能涉及将一个或多个纹理映射到它们。

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

除非您使用混合模式,否则第一个纹理不能影响第二个纹理。或者第三个。

  

如何更有效地绘制位图

一般情况下,。有一些方法可以提高传输图像数据的效率(以pixel buffer objects为中心进行异步传输和buffer streaming techniques),但如果您所做的只是blitting图像,那么正确的方法是不要每帧都创建纹理。

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