【发布时间】:2021-05-28 18:55:27
【问题描述】:
我正在尝试使用 OpenGL 3+ 使用点精灵来渲染一些粒子。我刚刚意识到我的观点存在重大问题。它们的大小会根据相机距离自动增加。结果如下:
接近粒子发射器:
而当距离很远时,一切都显得模糊而臃肿:
在旧版本中,似乎可以使用glPointParameter 调整磅值。该函数在新的 3+ OpenGL 中仍然可用,但它只支持两个参数。 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;
}
【问题讨论】:
-
您必须将
gl_PointSize与远离相机的距离一起缩放。 OpenGL 不会(也不能合理地)为你做这件事。 -
@ColonelThirtyTwo,但 OpenGL 已经在缩放这些点。我不能以某种方式禁用它吗?取消 GL 所做的规模似乎有点 hack...
-
它不是缩放点。无论它们的
z坐标如何,它们在屏幕上始终是gl_PointSize单位。它们只是在离开时看起来越来越大,因为其他一切都在变小。 -
@ColonelThirtyTwo,哦,我明白了,现在我意识到了。无论如何,文档中也很清楚:“gl_PointSize - 包含光栅化点的大小,以像素为单位”。谢谢。
-
是的,
gl_PointSize在窗口空间中。换句话说,它的度量单位是 1 个像素。
标签: opengl glsl particle-system point-sprites