【问题标题】:OpenGL ES render to non POT textureOpenGL ES 渲染到非 POT 纹理
【发布时间】:2013-06-05 23:46:16
【问题描述】:

我正在尝试使用 iOS 和 GL ES1 对纹理进行全屏渲染。我已经使用带有附加纹理的 FBO 实现了这一点,并且工作正常。

但我不确定我的方法是否正确: iPhone 屏幕不是二次方的,所以我所做的是将 glViewport 设置为最接近的 POT 值以匹配纹理大小,然后将其映射到与屏幕大小相同的四边形。这可行,但图像看起来有点模糊。

是否可以仅绘制附加到 FBO 的纹理的一部分,然后相应地映射四边形 UV 坐标?

另一种方法是使用非罐纹理,但我想避免这种情况。

【问题讨论】:

  • 为什么不简单地渲染到 NPOT 纹理?除了最旧的 iOS 设备(原始 iPhone、iPhone 3G)support NPOT textures 之外的所有设备。这些旧设备在当今使用的设备中所占的比例可以忽略不计,因此忽略它们是安全的。
  • 你是对的,但我也在计划一个 android 端口,我不确定是否所有的 android 设备都提供 NPOT 支持。我还听说 Npot 纹理通常比 pot 稍慢。

标签: ios opengl-es


【解决方案1】:

我会说你的方法很好,除了一件事。您写了“最近的 POT 值以匹配纹理大小”,不要使用最近的,使用较大的最近的。如果你缩小它,结果应该有点模糊。

因此,创建一个比屏幕本身更大的 POT 纹理,将其附加到帧缓冲区,使用与屏幕相同参数的视口,然后如果您需要使用该纹理重新显示,请使用纹理坐标,例如 screen.width/texture.width 而不是1.0。这应该会给你一个很好的 1:1 采样,结果应该尽可能清晰。

【讨论】:

  • 感谢您的回答!是的,对不起,正如你所说,“最近的锅纹理”是指“更大的最近锅”。 :)。看起来纹理的其余部分由 openGL 自动填充为白色。
  • 如果你完全清除缓冲区,它应该填充垃圾或清除颜色(你可能甚至不需要)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2016-07-23
相关资源
最近更新 更多