【问题标题】:Blending issues with simple particles简单粒子的混合问题
【发布时间】:2016-05-24 05:42:09
【问题描述】:

我在游戏中将粒子绘制为胶囊(两个 GL_POINTS,两个 GL_TRIANGLES)。一切都很好地批处理,所以我首先绘制三角形,然后是第二个点(总共两个绘制调用)。

我的问题是,在 OpenGL es 中你必须自己对 GL_POINTS 进行舍入,而我一直在片段着色器中这样做。

precision highp float;

varying float outColor;

vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

void main()
{
    vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
    gl_FragColor = vec4( hsv2rgb( vec3(outColor / 360.0, 1.0, 1.0) ) , step(dot(circCoord, circCoord), 1.0) );
}

问题是我还需要进行深度排序,因为粒子是在两个单独的绘图调用中绘制的,有时 z 位置在没有深度缓冲的情况下是不正确的,因为它们是在两个绘图调用中绘制的。

现在我已经有了深度缓冲区,并且圆角点没有很好地混合,而不是圆角粒子,它们周围有一个黑色区域。有什么想法吗?

一些额外说明: 我正在做 ios opengl es(我相信基于图块的延迟渲染)

每个粒子最初定义为两个点,即当前位置和上一帧中的位置。这两个点是稍后用 GL_POINTS 绘制的。然后矩形部分由两个三角形组成,通过找到一个垂直于两个点的向量的向量来确定。

此外,粒子已经按从前到后的顺序排序。从技术上讲,它们的 z 位置是任意的,我只需要它们完好无损。

【问题讨论】:

  • 我很好奇您使用的是桌面 OpenGL 还是 OpenGL ES。
  • @NicolBolas 我将其添加到帖子中。这有意义吗?
  • 我将首先使用深度测试条件,它也接受相等的 Z 坐标,但不能完全解决 Z 冲突。然后我将消除第二次绘制调用并一次性渲染所有内容。为此,您需要更改着色器,因此如果您靠近三角形的中间,则改为渲染您的点。在不知道您要做什么的情况下,这只是猜测工作。添加一些示例图像。如果您无法摆脱第二次绘制,则在相机空间的 Z 轴上渲染具有一定偏移量的点(在顶点着色器中进行),但如果您的三角形相交很多,这将不起作用

标签: opengl-es glsl


【解决方案1】:

此外,粒子已经按从前到后的顺序排序。从技术上讲,它们的 z 位置是任意的,我只需要它们完好无损。

我怀疑这是你的问题。

点是正方形的。您可以调整混合以使它们看起来是圆形的,但几何(以及因此深度值)仍然是方形的。点后面的东西被彩色圆形区域之外的角落Z-failed。

在不完全改变算法的情况下,唯一解决此问题的方法是使用三角形网格而不是点(因此实际几何图形是圆形的),或者片段着色器中的discard 片段用于圆外的点像素您想保留的区域。

请注意,在着色器中使用discard 可能相对昂贵,因此请检查该方法的性能...

【讨论】:

  • 我对此做了一些研究。事实证明,Apple 设备使用不同的渲染管道,这首先导致了问题。我尝试使用基于片段位置的点积的丢弃并且有效,令人惊讶的是具有可容忍的延迟量!当我将它移植到 android 时,情况可能会有所不同。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多