【发布时间】: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 应该可以正常工作