【问题标题】:What texture dimensions can OpenGL handleOpenGL 可以处理哪些纹理尺寸
【发布时间】:2014-01-31 12:30:18
【问题描述】:

我听说你需要两个纹理维度的能力才能让它在 OpenGL 中工作。但是,我已经能够加载 200x200 和 300x300(不是 2 的幂)的纹理。同时,当我尝试使用相同的代码加载 512x512(2 的幂)的纹理但无法加载数据时(顺便说一下,我正在使用 DevIL 加载这些 png)。我找不到任何可以告诉我将加载哪种尺寸的东西。我也知道您可以剪裁纹理并添加边框,但我不知道生成的尺寸应该是什么。

这里是加载函数:

void tex::load(std::string file)
{
    ILuint img_id = 0;
    ilGenImages(1,&img_id);
    ilBindImage(img_id);
    ilLoadImage(file.c_str());
    ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE);
    pix_data = (GLuint*)ilGetData();
    tex_width = (GLuint)ilGetInteger(IL_IMAGE_WIDTH);
    tex_height = (GLuint)ilGetInteger(IL_IMAGE_HEIGHT);
    ilDeleteImages(1,&img_id);
    //create
    glGenTextures(1,&tex_id);
    glBindTexture(GL_TEXTURE_2D,tex_id);
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,tex_width,tex_height,0,GL_RGBA,GL_UNSIGNED_BYTE,pix_data);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D,NULL);
}

【问题讨论】:

  • 图像不需要是“二的幂”,在较新版本的 OpenGL 中(虽然它也取决于 GPU 等)......但是你如何加载和处理图像/纹理?如果没有看到正在使用的实际代码,很难告诉你出了什么问题。
  • 查询MAX_TEXTURE_SIZE,它将让您知道您的 2D 纹理支持的最大宽度/高度。一些非常老的 GPU 不支持 512x512,但现在大多数支持介于 2048x2048 - 16384x16384 之间。你可以看到这些事情的统计数据here
  • 3379 是最大纹理尺寸
  • 不,不是 :P 那是你用来询问驱动程序值的常量枚举。这样做:GLint max_tex_size; glGetIntegerv (GL_MAX_TEXTURE_SIZE, &max_tex_size);
  • 我的错:这给了我 8192 所以 512x512 应该可以正常工作

标签: c++ opengl textures


【解决方案1】:

有一些消息来源确实说明了最大值,或者至少说明了如何计算,您的第一步应该是 OpenGL 规范,但为此最好知道您的目标是哪个 OpenGL。据我所知,OpenGL 有一个最小的 ma​​ximum 硬编码纹理大小,即 64x64,对于实际的最大值,实现负责通过 GL_MAX_TEXTURE_SIZE 告诉你,你可以在 glGet* 函数中使用它,这会告诉你实现可以处理的两个纹理的最大功率。

除此之外,OpenGL 本身永远不会提到两个纹理的非幂等性,除非它是较新的 opengl 版本中的核心功能或者它是扩展。

如果您想再次了解实际支持哪些组合,请参阅相应的规范,它会告诉您如何获取该信息。

【讨论】:

  • Non-Power-of-Two 纹理自 2.0 以来一直是 OpenGL 的核心要求。尽管那个时代的许多声称符合 OpenGL 2.0 的 GPU 并没有适当地支持它们……主要是 ATI GPU。
  • OpenGL 对最小纹理大小没有要求。然而,对最小支持的最大纹理大小有一个要求(即,任何 OpenGL 实现都必须支持小于 64×64 的纹理大小)。
  • @Andon M. Coleman 根据我的个人经验,我可以确认这是真的。 datenwolf,谢谢,我会解决的。
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2016-06-24
  • 1970-01-01
相关资源
最近更新 更多