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

Opengl es 将glGenerateMipmap()与glCopyTexImage2D()一起使用,opengl-es,opengl-es-2.0,textures,mipmaps,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,

我希望使用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。
在GLCOPYTEXTIMAGE2D()之前使用glGenerateMipmap()调用没有任何意义。那么,驱动程序将如何使用glCopyTexImage2D()加载非零mipmap级别?

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

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

编辑:正如datenwolf在他的评论中指出的那样,您可以通过执行

glTexParamteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);

但不要仅仅因为你想从1开始计数,而不是从0开始。另一方面,如果您拥有mipmap级别0的有效图像,并且希望为级别1设置一个图像,并使用该图像计算其他级别,那么在调用
glGenerateMipmap
之前将基本级别更改为1(可能在之后返回到0)可能是一个好主意,尽管我不能马上提出这种方法的用例。

不太清楚。glGenerateMipmap从基本级别(默认为0)开始生成mipmap,直到最大级别(默认为1000)。这两个值都可以使用标记GL_TEXTURE_BASE_LEVEL和GL_TEXTURE_MAX上的glTexParameter进行更改_LEVEL@datenwolf哈,真的。但是由于OP没有提到这一点,我想他没有改变基本级别(或者知道这个特性)。不过,这一点很好。此功能背后的主要思想是使延迟纹理图像加载成为可能。例如,在交互式应用程序中,这可用于仅加载纹理(和模型)的低分辨率LOD级别,并且仅当查看器接近模型时,才会上载更高分辨率的数据。根据驱动程序的质量,仅设置mipmap级别的子范围也允许驱动程序交换取消选择的级别以释放其他资源的快速内存。因此,在glCopyTexImage2d()调用中将mipmap级别设置为1,然后调用glGenerateMipMaps()将自动加载非零mipmp。直到这一点。但是在我的例子中,当我说mipmap_level=1时,什么都不会被渲染。我没有为级别0指定图像,因为我已经渲染了一个几何体,并且正在使用glCopyTexImage2D()调用。是否有其他方法可以指定级别0图像,然后使用glCopyTexImage2D()调用?谢谢您的回复。@maverick9888从您的评论中,我不完全理解您是否收到了这样的信息:设置级别1的图像(无论如何设置,可能使用
glCopyTexImage2D
),然后调用
glGenerateMipmaps
将使用
glGenerateMipmaps
生成的图像覆盖级别1的图像,它是从级别0的图像自动计算的。但是,如果您事先没有将图像设置为级别0,这将不起作用,因为这样您就没有有效的图像来计算mipmap。