【问题标题】:Possible to glTexImage2d an NPOT image onto a Pow-2 texture without extra allocation?可以在没有额外分配的情况下将 NPOT 图像 glTexImage2d 到 Pow-2 纹理上吗?
【发布时间】:2011-07-01 17:03:44
【问题描述】:

我发现仍然有相当多的驱动程序不支持 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 成为我的真实纹理位图的副本之后,在右侧和底部有额外的空间。

【问题讨论】:

    标签: opengl texture2d


    【解决方案1】:

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

    【讨论】:

    • 是否需要任何扩展/功能才能使用它?如果我担心与各种驱动程序的兼容性,我是制作更大的纹理还是使用 glTexSubImage2D 更好?
    • 不,这是标准行为,自古以来就是 OpenGL 的一部分。但是在使用 glTexSubImage 填充内容之前,您必须使用 glTexImage 初始化纹理。
    • 作为记录,'NULL' 作为一个可接受的指向 glTexImage2D 的数据指针可以追溯到 OpenGL 1.1,如果你使用 glGenTextures 已经是一个要求,而且太旧了,甚至微软的默认 GL 驱动程序也应该做对了。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多