OpenGL纹理生成

4

我目前正在尝试学习如何使用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
                  );

这两者之间有什么区别,我做错了什么吗?

2
你是怎么知道“它不工作”的?它会渲染一个黑色纹理还是会出现GL_INVALID_OPERATION错误? - Christian Rau
这是一个空白的纹理(形状是均匀着色的)。 - Kristina Brooks
1个回答

3
由于它与glTexImage2D(纹理是黑色的,我猜)无法正常工作,因此我猜您对纹理使用了基于mipmap的纹理过滤器(这也是默认设置)。尝试调用glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);来将纹理过滤器切换回线性过滤。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  //or maybe GL_NEAREST

请记住,glTexImage2D 只为所选的 mip 等级(在您的情况下是等级 0)设置图像,并且如果您使用基于 mip 的缩小过滤器(名称中带有 _MIPMAP_ 的常量),则仅当您提供了所有 mip 等级的图像(gluBuild2DMipmaps 会为您完成此操作)或者使用以下方法自动生成它们时,纹理的结果才被定义:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

在上传图像或更新之前。
glGenerateMipmap(GL_TEXTURE_2D);

一旦上传完成,前者需要OpenGL 1.4支持,后者需要FBO支持,我认为后者还是现代化的、非废弃的生成mipmaps的方法。这两种方法(尤其是后者)也比已废弃的GLU功能更受欢迎。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接