我正在尝试使用点精灵在OpenGL 3+中渲染某些粒子。我刚刚意识到我在这些观点上有重大问题。它们的尺寸会根据相机距离自动增加。结果如下:
靠近粒子发射器:
当距离很远时,一切看起来都模糊不清:
在旧版本中,似乎可以使用glPointParameter
来调整点大小比例。该功能在新的3+ OpenGL中仍然可用,但仅支持两个参数。 glPointParameter
看起来像我需要的,但我尝试了一下却没有结果。我也在使用GL_POINT_FADE_THRESHOLD_SIZE
还有其他方法可以避免根据相机距离自动缩放点吗?我宁愿不必更改代码以使用由三角形制成的标准广告牌。
不确定当前是否相关,但这是我正在使用的顶点着色器:
GL_POINT_FADE_THRESHOLD_SIZE
因此事实证明,我的问题是由于我对glEnable(GL_PROGRAM_POINT_SIZE);
的误解。如评论中所指出并在文档中明确指出的那样,layout(location = 0) in vec4 a_position_size; // Point size in w coord
layout(location = 1) in vec4 a_color; // RGBA color modulated with texture
layout(location = 0) out vec4 v_color;
uniform mat4 u_MVPMatrix;
void main()
{
gl_Position = u_MVPMatrix * vec4(a_position_size.xyz, 1.0);
gl_PointSize = a_position_size.w;
v_color = a_color;
}
包含光栅化点的大小,以像素为单位。因此,一旦我们远离它们,点精灵就会看起来更大,但这不是因为它们正在缩放,而是因为当3D场景的其余部分根据透视投影进行缩放时,它们仍然占据相同的屏幕空间。
我对顶点着色器进行了一些调整,以根据与查看器的距离实际缩放点的大小来解决该问题:
gl_PointSize
在将three.js与GLSL一起使用时遇到了同样的问题。根据glampert的答案解决了它,但首先,这三种.js都需要使用某些gl_PointSize
: