0

我发现仍然有相当多的驱动程序不支持 NPOT 纹理,所以我正在尝试使用 Texture2D 支持来改造我的 2D 引擎(基于 OpenTK,而后者又基于 OpenGL)依赖 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 成为我的真实纹理位图的副本之后,在右侧和底部有额外的空间。

4

2 回答 2

6

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

于 2011-02-22T08:25:36.750 回答
0

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

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