gl_PointSize 的点精灵在 OpenGL ES 2.0 和 OpenGL 3+ 中以不同的大小呈现

point sprites with gl_PointSize renders at a different size in OpenGL ES 2.0 and OpenGL 3+

我有一个 OpenGL 程序,它在 Mac OS X 上使用 OpenGL 3.2 Core 配置文件,在 iOS 上使用 OpenGL ES 2.0。

我的应用程序的一部分通过在顶点着色器中写入 gl_PointSize 来渲染点精灵。不幸的是,gl_PointSize 在 OpenGL 3 中呈现的效果似乎比在 OpenGL ES 2.0 中呈现的效果大大约 50 倍。每个 API 的文档都指出 gl_PointSize 定义了像素数,所以我不确定为什么会这样。是否可能有一个默认的 OpenGL 参数修改了 gl_PointSize 的输出?是否还有其他原因可能导致大小差异如此之大?

每个平台使用完全相同的着色器(桌面具有 ARB_ES2 兼容性)。我还检查了所有统一输入是否相同,并且都以相同的分辨率呈现。 在着色器之外,我进行的唯一与点精灵相关的调用是 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);。在每个相互独立的平台上,我可以很好地调整磅值。

关于视网膜的评论是正确的。由于 2 倍分辨率的视网膜屏幕,缩放乘法的组合产生了意想不到的结果。这导致点精灵在 OpenGL 3 上比在 OpenGL ES 2.0 上渲染大 16 倍。

当在着色器中写入原始值时,Point Sprite 实际上大了 2 倍,填充了 4 倍的区域。

要更正缩放问题,从规范中阅读此内容很有帮助:

Point rasterization produces a fragment for each framebuffer pixel whose center lies inside a square centered at the point’s (xw; yw), with side length equal to the current point size.