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)
这是我的功能:
init map[512][512]
全部设为零
在此地图上绘制所有内容,并累积alpha
循环地图上的每个像素,根据alpha
使用glTexImage2D()
生成纹理(我觉得这可能很慢)
使用glTexCoord2f
和glVertex3f
在窗口上绘制此内容。
使用这种方法,我绘制了大约100个东西,它变得非常慢(大约20 FPS)
我可以采取哪些措施来优化此方法或获得其他成就吗?
答案 0 :(得分:2)
我的问题是,如果我绘制2个纹理,它们的某些部分重叠,它们的alpha总和为0.7,如何显示这部分?
首先,一些术语:
您无法在所有处绘制纹理。您只能绘制三角形,可能涉及将一个或多个纹理映射到它们。
如果要将两个纹理映射到三角形,那么您对其alpha所做的操作取决于您的着色器(或者如果您不使用着色器,则使用glTexEnv
设置)。如果你是单独绘制它们,那么你不会绘制2个纹理。您正在绘制一个纹理,然后是另一个纹理。
除非您使用混合模式,否则第一个纹理不能影响第二个纹理。或者第三个。
如何更有效地绘制位图
一般情况下,不。有一些方法可以提高传输图像数据的效率(以pixel buffer objects为中心进行异步传输和buffer streaming techniques),但如果您所做的只是blitting图像,那么正确的方法是不要每帧都创建纹理。
您要做的是为OpenGL提供您计划使用的所有图像,然后使用纹理映射三角形(四边形)将它们直接绘制到屏幕上。这是在大多数进行2D blitting的应用程序中完成的。