Opengl es OpenGL纹理格式限制

Opengl es OpenGL纹理格式限制,opengl-es,fragment-shader,tga,Opengl Es,Fragment Shader,Tga,纹理是否也需要遵守某些格式限制 我正在加载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;

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

我正在加载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文件。

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

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

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


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

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

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

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


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

您使用的是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。。很明显,哦。我几乎想说纹理矩形在这里是合适的。过滤位图字体以实现缩放很少会产生有利的结果。通常需要使用各种不同分辨率的字体进行最近邻采样,这实际上是纹理矩形的完美用例。只要最小/最大灰度过滤器是最近的,s和T包裹行为是钳制到边缘(两者都不是默认纹理状态),ES 2.0就应完全支持这一点.您使用的是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 2.0或更高版本中,未压缩的纹理数据可以具有非二维幂函数。”不,桌面OpenGL 2.0+中的所有纹理都可以具有非二维幂函数,无论是否压缩。块大小也与纹理的大小无关,因为OpenGL规范不禁止部分块。该规范明确了块压缩格式如何适用于块大小不可分割的纹理。所以你的答案只适用于OpenGL。这个评论完全令人困惑,而且是错误的。DXTn纹理作为一个简单的示例,如果您尝试分配具有非块对齐尺寸的数据存储,将生成
GL\u INVALID\u操作
。其他压缩格式在各自的扩展规范中有自己的规则。当然,它只适用于OpenGL,我试图保持我的答案与讨论中的API相关。如果你想讨论Vulkan、Direct3D或其他API,请随意,但我看不出这会给这个问题带来什么价值。看来我永远也得不到答案。哦,好吧,不要让之前评论中的误导性陈述迷惑你。对齐和纹理宽度是不可分割的。具有任意宽度的8位每分量RGB图像可能不会在4字节边界上结束每行,而具有2次幂(>=4)宽度的相同8位RGB格式将始终结束。然而,仅仅因为这满足了某些对齐要求,答案的全部要点就是给你举几个例子,乍一看可能是与两个纹理采样的非幂相关的问题,但事实并非如此