Issue with glGetTexLevelParameter
Issue with glGetTexLevelParameter
我在尝试使用 glGetTexLevelParameter 函数获取纹理的宽度和高度时遇到问题。无论我尝试什么,该函数都不会设置宽度或高度变量的值。我检查了错误,但一直没有收到错误。 这是我的代码(如果有帮助,基于 NeHe 教程):
int LoadGLTextures()
{
//load image file directly into opengl as new texture
GLint width = 0;
GLint height = 0;
texture[0] = SOIL_load_OGL_texture("NeHe.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); //image must be in same place as lib
if(texture[0] == 0)
{
return false;
}
glEnable(GL_TEXTURE_2D);
glGenTextures(3, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //no filtering bc of GL_NEAREST, looks really bad
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
const GLubyte* test = gluErrorString(glGetError());
cout << test << endl;
return true;
}
我也在使用Visual Studio 2010,如果有帮助的话。加载纹理[0]的调用来自土壤图像库。
让我们分解一下:
此调用加载图像,创建新的纹理 ID,并将图像加载到由此 ID 命名的纹理对象中。如果成功,ID将返回并存储在texture[0]
中。
texture[0] = SOIL_load_OGL_texture(
"NeHe.bmp",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y);
顺便说一句:图像文件不与库位于同一目录中,而是在调用此函数时的进程的当前工作目录中。如果您没有更改工作目录,则它是从任何调用您的进程的目录。
检查纹理是否成功放置
if(texture[0] == 0)
{
return false;
}
在此处启用纹理几乎没有意义。 glEnable
调用属于呈现代码。
glEnable(GL_TEXTURE_2D);
好的,这里有一个问题。 glGenTextures 生成新的纹理 ID,并将它们放在提供给它的数组中。之前存储在该数组中的任何内容都将被覆盖。在您的情况下,SOIL_load_OGL_texture
生成并返回的纹理 ID .请注意,这只是一些句柄,不会以任何方式进行垃圾回收。您现在面对一个在 OpenGL 中晃来晃去的纹理对象,并且不再访问它,因为您扔掉了手柄。
glGenTextures(3, &texture[0]);
现在,绑定由新创建的 ID 命名的纹理对象。由于这是一个新 ID,因此您实际上是在创建一个未分配图像数据的新纹理对象。
glBindTexture(GL_TEXTURE_2D, texture[0]);
以下所有调用的操作纹理与 SOIL 创建的纹理完全不同。
如何修复代码:删除glGenTextures
。在您的情况下,这不仅是多余的,而且是问题的原因。
这一行:
texture[0] = SOIL_load_OGL_texture("NeHe.bmp", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);
创建一个纹理,将 OpenGL 纹理存储在 texture[0]
中。
这一行:
glGenTextures(3, &texture[0]);
创建三个纹理,将它们存储在texture
数组中,覆盖那里的任何纹理。
看到问题了吗?你从 SOIL 得到一个纹理,然后你立即用新创建的纹理覆盖它来扔掉它。
这在概念上与以下内容没有什么不同:
int *pInt = new int(5);
pInt = new int(10);
嗯,glGenTextures(howmany,where)不是像glGenBuffers一样工作吗?为什么要为一个指针分配三个纹理,它应该如何工作?
我认为应该是
int textures[3];
glGenTextures(3,textures);
这样,三个生成的纹理缓冲区将被放置在纹理数组中。或
int tex1, tex2, tex3;
glGenTextures(1,&tex1);
glGenTextures(1,&tex2);
glGenTextures(1,&tex3);
所以你有三个单独的纹理缓冲区指针
- 没有找到相关文章