我将游戏中的粒子绘制为一个胶囊(两个GL_POINTS,两个GL_TRIANGLES)。所有东西都很好地分批,所以我先绘制三角形,然后绘制第二个点(总共绘制两个绘图)。
我的问题是,在OpenGL中你必须自己舍入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位置是任意的,我只需要它们完好无损。
答案 0 :(得分:1)
此外,粒子已按前后顺序排序。从技术上讲,他们的z位置是任意的,我只需要它们完好无损。
我怀疑那是你的问题。
积分是正方形。您可以调整混合以使它们显示为圆形,但几何(因此深度值)仍然是正方形。这一点背后的事情是由于彩色圆形区域之外的角落Z-失败。
如果不完全改变你的算法,唯一的解决办法就是使用三角形网格而不是一个点(所以实际的几何形状是圆形的),或片段着色器中的discard
个片段用于外面的点像素你要保留的圆形区域。
请注意,在着色器中使用discard
可能相对较贵,因此请检查该方法的性能......