【问题标题】:OpenGL texture generationOpenGL纹理生成
【发布时间】:2011-10-23 21:33:26
【问题描述】:

我目前正在尝试弄清楚如何使用 OpenGL。我想从字节缓冲区创建纹理。

由于某种原因,当我使用 glTexImage2D 执行此操作时,它不起作用(纹理显示为空白):

glTexImage2D(GL_TEXTURE_2D,
             0,
             GL_RGBA,
             texwidth,
             texheight,
             0,
             GL_RGBA,
             GL_UNSIGNED_BYTE,
             bytes
             );

当我使用gluBuild2DMipmaps 时,它确实有效:

gluBuild2DMipmaps(GL_TEXTURE_2D,
                  3,
                  texwidth,
                  texheight,
                  GL_RGBA,
                  GL_UNSIGNED_BYTE,
                  bytes
                  );

两者有什么区别,我做错了什么?

【问题讨论】:

  • 你怎么知道“它不起作用”?它是渲染黑色纹理还是得到GL_INVALID_OPERATION
  • 这是一个空白纹理(形状颜色统一)。

标签: c opengl textures


【解决方案1】:

因为它与gluBuild2DMipmaps 一起“工作”而不是glTexImage2D(我猜纹理是黑色的),我猜你有一个基于 mipmap 的纹理过滤器(这也是默认设置)。尝试调用

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  //or maybe GL_NEAREST

永远记住,glTexImage2D 只为选定的 mipmap 级别(在您的情况下为级别 0)设置图像,如果您使用基于 mipmap 的缩小过滤器(名称中带有 _MIPMAP_ 的常量),则仅当您向所有 mipmap 级别提供图像(gluBuild2DMipmaps 为您执行)或使用任一自动生成它们时,才会定义纹理

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

在上传图片或更新之前

glGenerateMipmap(GL_TEXTURE_2D);

一旦上传。前者需要 OpenGL 1.4,而后者需要 FBO 支持,我认为,这也是生成 mipmap 的不被弃用的现代方式。这两种方式(尤其是后者)也优于已弃用的 GLU 功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多