Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 我们可以用什么来代替OpenGL ES中的混合?_Opengl Es_Blending - Fatal编程技术网

Opengl es 我们可以用什么来代替OpenGL ES中的混合?

Opengl es 我们可以用什么来代替OpenGL ES中的混合?,opengl-es,blending,Opengl Es,Blending,我正在使用OpenGL绘制iPhone图形。在我的一个项目中,我需要使用一个图像,我需要在OpenGL中将其用作纹理。.png图像大小为512*512,背景透明,图像中心有一条粗蓝线 当我在OpenGL中将图像应用于多边形时,纹理看起来就像图像中的透明部分是黑色的,而粗蓝线被视为自身。为了去除黑色部分,我使用了混合: glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 然后删除多边形中纹理的黑色部分。现在只看到蓝带了

我正在使用OpenGL绘制iPhone图形。在我的一个项目中,我需要使用一个图像,我需要在OpenGL中将其用作纹理。
.png
图像大小为
512*512
,背景透明,图像中心有一条粗蓝线

当我在OpenGL中将图像应用于多边形时,纹理看起来就像图像中的透明部分是黑色的,而粗蓝线被视为自身。为了去除黑色部分,我使用了混合:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
然后删除多边形中纹理的黑色部分。现在只看到蓝带了。这样问题就解决了

但我想在OpenGL中添加许多这样的图像并创建许多对象。我能够做到这一点,但当我向对象添加越来越多的图像时,帧速率非常低。但是当我注释掉混合时,帧速率是正常的,但是图像看不到

由于我没有很好的fps,图形有点慢,我得到一个不稳定的效果

因此:

1) 除了混合,还有其他方法解决我的问题吗


2) 如何提高OpenGL应用程序的帧速率?要正确实现我的图形,需要采取哪些所有步骤?

如果您想要对象的透明部分,唯一的方法是将三角形的像素数据与缓冲区中当前的内容(您当前正在做的事情)混合。通常,当使用实体纹理时,三角形的新像素数据只会覆盖缓冲区中曾经存在的内容(只要它更接近,即z缓冲区)。但是有了透明度,它就可以开始观察纹理那一部分的透明度,看看它后面是什么,一直回到实体。然后将所有这些重叠的透明材料层结合起来,直到得到最终的图像

如果你想要你的透明度只是一个简单的树精灵,从树干的侧面移除“东西”等等。那么你最好提供更复杂的几何体来定义树干的形状,这样就不需要担心透明度了


可悲的是,我认为除了降低你正在计算的透明度之外,你没有什么办法来加速你的FPS。甚至可以添加一些优化来检查图像,看看是否可以为该图像启用alpha混合。根据您的努力程度,可能会在长期错误中节省时间。

谢谢您的回复。在我的项目中,我使用512*512纹理,其中几乎90%是透明部分。用你的话来说,如果我能降低纹理的透明度,我就能提高速度。。这对我来说是个好消息。但通过这样做,我在iphone屏幕上看到的对象会稍微大一点。因此,似乎除了在opengl中进行混合之外,没有其他方法可以去除纹理的黑色部分..?您可以尝试alpha测试,而不是混合,如果您不需要混合,只需要完全不透明和完全透明的区域,alpha测试可能会稍微快一点<代码>glEnable(GLU阿尔法测试);glAlphaTest(GL_LESS,1.0)丢弃所有非100%不透明的像素。我不认为这会带来很大的性能提升,因为基于平铺的渲染器仍然无法像在没有alpha的情况下那样丢弃隐藏像素。本质上,iPhone上的透明度非常昂贵,因为硬件针对完全不透明的纹理进行了优化。为了提高性能,您需要尽量减少混合和alpha的使用。如果无法继续仅使用完全不透明的纹理,则需要将对象分解,以便只有真正需要混合的部分使用它,并且首先渲染场景的其余部分,禁用混合。