【问题标题】:point sprites with gl_PointSize renders at a different size in OpenGL ES 2.0 and OpenGL 3+具有 gl_PointSize 的点精灵在 OpenGL ES 2.0 和 OpenGL 3+ 中以不同的大小呈现
【发布时间】:2016-07-11 04:48:28
【问题描述】:

我有一个 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);。在相互独立的每个平台上,我都可以很好地调整点大小。

【问题讨论】:

  • X 和 Y 各占 50%?
  • @NicolBolas 那是 50 倍,这是一个粗略的估计,表明一个比另一个大得多。因为它是一个点精灵,我会假设它总是渲染相等的 x 和 y。
  • 您实际使用的是什么值?一种解释是您使用的尺寸超出了 iOS 支持的限制。
  • @RetoKoradi 输出在 10.0 到 30.0 左右。但是,如果我只是调整这些值,我就能让 iOS 精灵也渲染得很大。你知道我可以在哪里阅读有关限制的信息吗?
  • @JustinMeiners:“这是 50 倍,这是一个粗略的估计,表明一个比另一个大得多。”好的,但更准确地知道会大多少有帮助。 50x 几乎是不可能的,因为这意味着要么 OpenGL 在 500 像素左右渲染一个 10 像素的精灵,要么 ES 在 0.2 像素左右渲染一个 10 像素的精灵。

标签: opengl opengl-es opengl-es-2.0


【解决方案1】:

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

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

为了纠正缩放问题,从规范中阅读这一点很有帮助:

点光栅化为每个帧缓冲区像素生成一个片段 其中心位于以该点 (xw; yw) 为中心的正方形内, 边长等于当前点的大小。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多