0

我希望使用 glCopyTexImage2D() 上传具有非零 mipmap 级别的纹理。我正在使用以下代码:

// Render Some Geometry

GLint mipmap_level = 1;

glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureId);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);  

glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,mipmap_level,GL_RGBA16_SNORM,0,0,128,128,0);
// Five other glCopyTexImage2D() calls to load textures

glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

//Render geometry

在这里,如果我使用 mipmap_level = 1,则根本不会绘制几何图形。mipmap 级别如何与 glCopyTexImage2D() API 结合使用?我想使用 level = 1 加载 64x64 纹理,即第一个采样的 mipmap。在 glCopyTexImage2D() 之前使用 glGenerateMipmap() 调用没有任何意义。那么驱动程序将如何使用 glCopyTexImage2D() 加载非零 mipmap 级别?

4

1 回答 1

2

您首先为 mipmap 级别 1 设置图像,然后调用glGenerateMipmap以从第一个 mipmap 级别(即 mipmap 级别 0)的图像自动生成 mipmap 。因此,所有级别 0 之后的 mipmap 图像都会被自动生成的图像覆盖。glGenerateMipmap不在乎您如何为 mipmap 级别 0 设置图像,它只是假设您这样做了。另一方面,我没有看到您为级别 0 指定图像,因此它可能只是包含垃圾或被视为不完整,这将使相应纹理的任何使用都失败。

最后,我希望这个问题不仅仅意味着知道在大多数编程语言中,通常从 0 而不是 1 开始计数,OpenGL 也是如此。

编辑:正如datenwolf在他的评论中指出的那样,您可以更改用于 mipmap 过滤的基本 mipmap 级别,并glGenerateMipmap通过执行

glTexParamteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);

但是不要仅仅因为你想从 1 而不是 0 开始计数就这样做。另一方面,如果你有一个适用于 mipmap 级别 0 的有效图像并且想要为级别 1 设置一个并将其用于计算其他级别,然后在调用之前将基本级别更改为 1 glGenerateMipmap(可能之后再更改为 0)可能是一个好主意,尽管我无法立即为这种方法提出一个用例。

于 2012-11-20T09:02:19.957 回答