我发现仍有相当数量的驱动程序不支持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成为我的真实纹理位图的副本后,在右侧和底部有额外的空间。
答案 0 :(得分:5)
将glTexImage2D
与空数据一起使用以初始化纹理,并使用glTexSubImage2D
以使用数据填充其中的一部分。从技术上讲,OpenGL允许给glTexImage{1,2,3}D
的数据参数为空指针,表示纹理对象只是初始化。它取决于语言绑定,如果目标语言仍然支持该功能 - 只需测试传递空指针时会发生什么。
答案 1 :(得分:0)
datenwolf对于如何使用部分图像初始化纹理是正确的,但是您需要注意以下两个问题:
[0-orig_width/padded_width]