【发布时间】:2018-04-13 08:18:42
【问题描述】:
渲染混合点精灵和 3D 对象的最佳方式是什么?
例如,我想将“太空尘埃”粒子建模为点精灵。在太空中,我可以有大的小行星物体(为简单起见是立方体),太空尘埃颗粒可能位于小行星立方体的前面或后面。
我被两种情况困住了:
- 我先渲染空间尘埃点精灵,使用
gl_DepthMask(GL_TRUE),然后渲染小行星立方体(空间尘埃总是在小行星之后) - 我先渲染小行星立方体,使用
gl_DepthMask(GL_FALSE),渲染空间尘埃点精灵并设置gl_DepthMask(GL_TRUE)(空间尘埃总是出现在小行星前面)
我目前正在使用单个粒子发射器顶点着色器,该着色器在随机 (x,y,z) 位置绘制大量带有gl_DrawArrays() 的粒子。
如何渲染大量粒子,使它们同时出现在小行星立方体的前后?
如果我的粒子是单独的四边形,那么我可以对 Z 渲染的顺序进行排序,但我不知道如何使用 gl_DrawArrays()、GL_POINTs 和我的顶点着色器来实现这种行为。
我是否应该将粒子拆分为数组集?例如,我是否必须这样做:
- 绘制所有小行星背后的粒子阵列
- 将小行星拉到最远的地方
- 绘制另一个粒子阵列,这些粒子出现在上面的小行星前面,但在下一个最近的小行星后面
- 画出最前面的小行星
如果我有很多小行星,这不是非常低效吗?
与我上面的建议相比,OpenGL 肯定有更好的方法来实现这一点?
更新:尝试 Thomas 的建议:
我的立方体和粒子使用以下混合/深度调用进行渲染:
// First render opaque object(s)
glEnable( GL_DEPTH_TEST );
glDepthMask( true );
g_ObjCube1.Render();
// Now render sprites with particle emitter - sprites should appear
// behind and in front of above cube
glEnable( GL_POINT_SPRITE );
// Stop overlapping particles from interfering with each other
//glDisable( GL_DEPTH_TEST ); <- NO! Must leave depth test enabled
glDepthMask( false );
glEnable( GL_BLEND );
//glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glBlendFunc( GL_SRC_ALPHA, GL_ONE ); // Doing the same as above
glBlendEquation( GL_FUNC_ADD );
...
glDrawArrays( GL_POINTS, 0, NUM_PARTICLES );
...
glDepthMask( true );
【问题讨论】:
标签: opengl fragment-shader vertex-shader glm-math geometry-shader