Ted*_*ton 18 opengl textures pyopengl mipmaps
没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个mipmap.我这样做是为了进行单元测试.似乎没有一个glGetTexParameter参数可以找到它.我最接近的是这样的:
int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
int width;
glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
if ( 0 == width )
{
max_mipmap = i-1;
break;
}
)
Run Code Online (Sandbox Code Playgroud)
无论如何,glGetTexLevelParameter()如果我使用的是NVidia GPU,将为不存在的mipmap返回0宽度,但是对于Mesa,它会返回GL_INVALID_VALUE,这让我相信这是非常错误的事情.
如何找出我填充纹理的mipmap级别?
Nic*_*las 10
规范在这方面有点模糊.它表示GL_INVALID_VALUE如果level参数"大于允许的最大细节级别" ,您将获得.具体如何定义没有说明.
该函数的文档清除了一点,说它是最大可能纹理(GL_MAX_TEXTURE_SIZE)的最大可能LOD数.其他类似的功能,如glFramebufferTexture家庭明确表示这是限制GL_INVALID_VALUE.所以我希望如此.
因此,梅萨有一个错误.但是,您可以通过假设0或GL_INVALID_VALUE错误意味着您已离开mipmap数组的末尾来解决此问题.
话虽如此,我建议雇用glTexStorage,甚至不必再问这个问题.这将强制阻止某人将MAX_LEVEL设置为太大的值.从GL 4.2开始,这是一个非常新的,但是它仍然在所有仍然受支持的非英特尔硬件上实现(或将很快).
看起来目前无法查询纹理有多少mipmap级别,缺少使用@NicolBolas'无效值检查的OPs试验/错误.对于大多数情况,我猜如果0级大小不经常改变,其性能无关紧要.
但是,假设纹理没有有限数量的级别,则规范给出了首选计算(注意使用floor,而不是 ceiling作为一些示例给出):
numLevels = 1 + floor(log2(max(w, h, d)))
Run Code Online (Sandbox Code Playgroud)
每个连续较小的mipmap级别的降维规则是什么?
每个连续较小的mipmap级别是前一级别的一半,但如果此半值是小数值,则应向下舍入到下一个最大整数.
...
请注意,此扩展与支持其他规则兼容,因为它只是放松了mipmap的错误和完整性条件.同时,为开发人员提供单一的一致规则是有意义的,因为开发人员不太可能不必要地为不同的规则生成mipmap.一个合理的规则是充分和可取的,"最低"惯例是最佳选择.
这当然可以通过OPs方法验证,或者在我收到GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENTwith的情况下验证glFramebufferTexture2D(..., numLevels).
| 归档时间: |
|
| 查看次数: |
8425 次 |
| 最近记录: |