【问题标题】:OpenGL Textures Format RestrictionsOpenGL 纹理格式限制
【发布时间】:2016-04-08 01:50:30
【问题描述】:

纹理是否也需要遵守某些格式限制?

我正在加载 TGA 文件并使用以下片段着色器绘制它们:

varying vec2      v_texCoord;
uniform sampler2D s_texture;
uniform vec4      vColor4;

void main()
{
  vec4 tmpColor = texture2D( s_texture, v_texCoord );

  tmpColor.r = vColor4.r;
  tmpColor.g = vColor4.g;
  tmpColor.b = vColor4.b;

  gl_FragColor = tmpColor;
}

我发现 16x16 图像显示正常。 64x16 显示正常。 72x16、80x16 和 96x16 不起作用。

如果需要,我会提供更多信息,包括 TGA 文件。

【问题讨论】:

  • 您使用的是 OpenGL 还是 OpenGL ES?过去对纹理有限制,它们需要在两个维度上都是二次方。但是,在 2.0 版之后,该限制已从 OpenGL 中删除。使用 OpenGL ES 和 WebGL,该限制可能仍然存在(除非您的实现支持移除限制的扩展)。
  • @radical7 我正在使用 OpenGL ES2.0。你说的那是有道理的。那么在 64x16 之后它必须是 128x16 和 256x16 等?
  • 只用 2^n 就像 2 4 8 16 32 64 128 256 512 1024.. 很明显。
  • 哦。我几乎想说纹理矩形在这里是合适的。过滤位图字体以完成缩放很少会产生有利的结果。您通常需要使用各种不同分辨率的字体进行最近邻采样,这实际上是纹理矩形的完美用例。
  • 这应该在 ES 2.0 中得到完全支持,只要 min/mag 过滤器是最近的并且 S 和 T 环绕行为是钳制到边缘(这两者都不是默认纹理状态)。跨度>

标签: opengl-es fragment-shader tga


【解决方案1】:

72、80 和 96 不是二次方;这个要求与 OpenGL ES 中的数据格式关系不大。即使在现代桌面 GL 中,这一要求实际上也很普遍,它可能取决于所使用的数据格式。

(桌面)OpenGL 2.0 或更高版本中的未压缩纹理数据可以具有非二次方维度。

但是,压缩纹理数据继续要求块大小为 4 的倍数,像素传输函数继续假定图像中每一行的 4 字节数据对齐,浮点纹理(如果支持)可能还需要 2 的幂,等等。

许多为 GL 设计的图像库实际上会将内容重新缩放为 2 的幂,这可以解决上面讨论的每一个问题。解决维度问题并不总是最合适的方法(它可能会非常浪费),但它可以普遍应用于几乎任何常见的维度问题。

【讨论】:

  • 是的,我使用的所有纹理都是压缩的。
  • "(桌面)OpenGL 2.0 或更高版本中的未压缩纹理数据可以具有非二次方维度。" 不,全部 i> 桌面 OpenGL 2.0+ 中的纹理可以具有非 2 次方维度,无论是否压缩。块大小也与纹理的大小无关,因为 OpenGL 规范不禁止部分块。该规范清楚地说明了块压缩格式如何适用于大小不能被块大小整除的纹理。所以你的答案只适用于 OpenGL。
  • 该评论完全令人困惑,并且可以验证是错误的。如果您尝试分配具有非块对齐维度的数据存储,则 DXTn 纹理作为一个简单示例将生成 GL_INVALID_OPERATION。其他压缩格式在各自的扩展规范中讨论了它们自己的规则。当然它只适用于 OpenGL,我尽量保持我的答案与讨论中的 API 相关。如果您想讨论 Vulkan、Direct3D 或其他一些 API,请做我的客人,但我看不出它会给问题带来什么价值。
  • 看来我永远不会得到答案。哦,好吧,不要让之前评论中的误导性陈述使您感到困惑。对齐和纹理宽度密不可分。具有任意宽度的每组件 8 位 RGB 图像可能不会在 4 字节边界上结束每一行,而具有 2 的幂 (>= 4) 宽度的相同 8 位 RGB 格式总是会。然而,仅仅因为这满足了某些对齐要求,答案的重点是给你几个例子,乍一看可能是与非二次幂纹理采样相关的问题,但实际上并非如此。
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多