将glGenerateMipmap()与glCopyTexImage2D()一起使用

时间:2012-11-20 07:46:15

标签: opengl-es opengl-es-2.0 textures mipmaps

我希望使用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级别?

1 个答案:

答案 0 :(得分:2)

首先为mipmap level 1设置图像,然后调用glGenerateMipmap从第一个mipmap级别的图像(mipmap level 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设置一个并使用它来计算其他级别,然后在调用glGenerateMipmap之前将基级更改为1(并且可能回到0之后)可能是一个好主意,尽管我不能立即为这种方法提供一个用例。