Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/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 GLKit/OpenGLES 2.0:如何订购原语?_Opengl Es_Geometry_Transparency_Opengl Es 2.0_Glkit - Fatal编程技术网

Opengl es GLKit/OpenGLES 2.0:如何订购原语?

Opengl es GLKit/OpenGLES 2.0:如何订购原语?,opengl-es,geometry,transparency,opengl-es-2.0,glkit,Opengl Es,Geometry,Transparency,Opengl Es 2.0,Glkit,我想用GLKit绘制半透明的原语。我已经通过glDisable(GL\u depth\u TEST)禁用了深度测试,并通过 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 现在对于较大的alpha值(例如0.9),我需要先绘制最远的三角形,这样它们就不会出现在较近的三角形上方。这也在以下文件中说明: 透明度最好使用混合函数(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)实现,基本体

我想用GLKit绘制半透明的原语。我已经通过
glDisable(GL\u depth\u TEST)
禁用了深度测试,并通过

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
现在对于较大的alpha值(例如0.9),我需要先绘制最远的三角形,这样它们就不会出现在较近的三角形上方。这也在以下文件中说明:

透明度最好使用混合函数(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)实现,基本体从最远到最近排序。请注意,此透明度计算不需要在帧缓冲区中存在alpha位平面

以及在:

在应用程序中使用深度缓冲时,需要注意渲染基本体的顺序。需要先渲染完全不透明的基本体,然后按从后到前的顺序渲染部分不透明的基本体。如果不按此顺序渲染基本体,则通过部分不透明的基本体可以看到的基本体可能会完全丢失深度测试

但是,由于视角可以更改(当我更改渲染效果的
modelViewMatrix
时),从最远到最近的顺序取决于当前视角

有没有办法让OpenGL以正确的顺序自动渲染我的原语,如果没有,最好的方法是什么?我认为计算的z位置(取决于当前的视角)和为每一帧订购几千个三角形(或者更准确地说,每次视角改变时,可以是每一帧)成本太高,特别是因为我需要为每一帧将此顺序推送到GPU


请注意,我不关心使用纹理(仅使用彩色顶点)。

首先,不,没有办法让OpenGL为您做到这一点。您必须根据当前相机和模型位置(即模型视图矩阵)手动排序透明几何体

为了实现这一点,在实时实现中,通常不会对单个三角形进行排序,而是对其逻辑子集(网格、子网格)进行排序。然后,问题案例变成:

  • 单个渲染元素中的非凸几何体。通常由 事先手动拆分几何体,或忽略瑕疵
  • 不同元素的相交几何图形。通常没有解决
就性能而言,在构建场景时,在(部分)透明的v.s.非透明中分割元素非常重要。这样可以避免大型排序操作,因为您只需要对透明几何体进行排序

先进技术

对于完全不同的方法,请查阅深度剥离和类似技术。如果做得好,这些技术可以提供很多帮助。然而,我不知道有任何OpenGL ES标题真正实现了它们。但这并不意味着它不是一个选项

但是…

如果您还不太熟悉3D编程,我强烈建议您坚持使用手动排序,并尽量减少工件。通过这种方式,您可以在知情的情况下决定这样的实现对于您的特定案例是否足够


如果没有其他东西的话,实现这一功能将自动赋予你超人的能力,让你能够立即发现(并被)从现在开始玩的每一款视频游戏中与透明度相关的渲染问题所困扰。一项了不起的技能

首先,不,没有办法让OpenGL为您做到这一点。您必须根据当前相机和模型位置(即模型视图矩阵)手动排序透明几何体

为了实现这一点,在实时实现中,通常不会对单个三角形进行排序,而是对其逻辑子集(网格、子网格)进行排序。然后,问题案例变成:

  • 单个渲染元素中的非凸几何体。通常由 事先手动拆分几何体,或忽略瑕疵
  • 不同元素的相交几何图形。通常没有解决
就性能而言,在构建场景时,在(部分)透明的v.s.非透明中分割元素非常重要。这样可以避免大型排序操作,因为您只需要对透明几何体进行排序

先进技术

对于完全不同的方法,请查阅深度剥离和类似技术。如果做得好,这些技术可以提供很多帮助。然而,我不知道有任何OpenGL ES标题真正实现了它们。但这并不意味着它不是一个选项

但是…

如果您还不太熟悉3D编程,我强烈建议您坚持使用手动排序,并尽量减少工件。通过这种方式,您可以在知情的情况下决定这样的实现对于您的特定案例是否足够


如果没有其他东西的话,实现这一功能将自动赋予你超人的能力,让你能够立即发现(并被)从现在开始玩的每一款视频游戏中与透明度相关的渲染问题所困扰。一项了不起的技能

没有自动解决方案,因为由于相互重叠的问题,没有可靠的实时解决方案。如果你原谅ASCII艺术,考虑四个四边形排列为:

     +--+             +--+
     |  |             |  |
+---------------------|  |------+
|                     |  |      |
+---------------------|  |------+
     |  |             |  |
     |  |             |  |
     |  |             |  |
+----|  |-----------------------+
|    |  |                       |
+----|  |-----------------------+
     |  |             |  |
     +--+             +--+
没有正确的顺序。您需要将至少一个四边形拆分为两个,这就是像构建BSP树这样的提前计划所能做到的。这就是为什么存在深度缓冲;在大多数几何体不透明的基础上,解决每个像素的此问题

因此,最好的方法是:

  • 为您的透明几何体构建BSP树(以获得完全的精度)
  • 为透明几何体构建每个对象的BSP树,对对象进行排序