【发布时间】: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 轴上渲染具有一定偏移量的点(在顶点着色器中进行),但如果您的三角形相交很多,这将不起作用