我想用 GLKit 绘制半透明的图元。我已经通过禁用深度测试glDisable(GL_DEPTH_TEST)
并通过启用混合
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
现在对于较大的 alpha 值(例如 0.9),我需要先绘制最远的三角形,这样它们就不会出现在更近的三角形上方。glBlendFunc的文档中也说明了这一点:
透明度最好使用混合函数(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)来实现,基元从最远到最近排序。请注意,此透明度计算不需要帧缓冲区中存在 alpha 位平面
在应用程序中使用深度缓冲时,您需要注意渲染图元的顺序。需要首先渲染完全不透明的图元,然后以从后到前的顺序渲染部分不透明的图元。如果您不按此顺序渲染图元,则通过部分不透明的图元可以看到的图元可能会完全失去深度测试。
但是由于视角可以改变(当我改变渲染效果时modelViewMatrix
),从最远到最近的顺序取决于当前的视角。
有没有办法让OpenGL以正确的顺序自动渲染我的图元,如果没有,最好的方法是什么?我认为计算(取决于当前视角)的 z 位置并为每帧排序几千个三角形(或者更准确地说,每次视角变化时,可能是每一帧)成本太高,特别是因为我需要将此订单推送到每帧的 GPU。
请注意,我不关心使用纹理(只是彩色顶点)。