可以将NPT图像glTexImage2d转换为Pow-2纹理而无需额外分配?

时间:2011-02-22 03:09:47

标签: opengl texture2d

我发现仍有相当数量的驱动程序不支持NPOT纹理,所以我试图改造我的2D引擎(基于OpenTK,后者又基于OpenGL) Texture2D支持而不是依赖于GL_ARB_texture_rectangle。作为其中的一部分,我强制所有NPOTS纹理位图分配额外的空间,直到下一个2的幂大小,这样它们就不会在这些驱动程序上造成错误。我的问题是,我是否真的需要调整实际位图和纹理的大小并分配所有额外的内存,或者是否有办法告诉OpenGL我想要2次幂大小的纹理,但我只会使用左上角的一部分?

现在我的电话看起来像这样:

GL.TexImage2D(texTarget, 0, PixelInternalFormat.Rgba8, bmpUse.Width, bmpUse.Height, 0, PixelFormat.Bgra, PixelType.UnsignedByte, bits.Scan0);

这是在我使bmpUse成为我的真实纹理位图的副本后,在右侧和底部有额外的空间。

2 个答案:

答案 0 :(得分:5)

glTexImage2D与空数据一起使用以初始化纹理,并使用glTexSubImage2D以使用数据填充其中的一部分。从技术上讲,OpenGL允许给glTexImage{1,2,3}D的数据参数为空指针,表示纹理对象只是初始化。它取决于语言绑定,如果目标语言仍然支持该功能 - 只需测试传递空指针时会发生什么。

答案 1 :(得分:0)

datenwolf对于如何使用部分图像初始化纹理是正确的,但是您需要注意以下两个问题:

  • 您需要重新映射网格的纹理坐标,因为完整纹理的[0-1]纹理范围现在还包含未初始化的数据,而不是完整的纹理。现在有用的范围是[0-orig_width/padded_width]
  • 包裹你的纹理只会包裹整个纹理,而不是你的子部分。