3

我正在尝试使用 DevIL 加载图像,然后创建纹理。我有一个名为 的类Texture,我在构造函数中做所有这些事情。已创建有效的上下文。我在第一次调用时遇到了访问冲突glTextureParameteri(),所以我猜纹理没有正确绑定。我只是看不出它为什么不绑定。

这是构造函数:

Texture::Texture(const std::string& filename){
//DevIL handle for the image
unsigned int ilID;

ilGenImages(1, &ilID);

ilBindImage(ilID);

ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);

if (!ilLoad(IL_BMP, (ILstring)filename.c_str())){
    DebugUtility::gl_log_err("Failed to load image &s\n", filename.c_str()); //Just function that prints to log file
    return;
}
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

glGenTextures(1, &texture);

//"texture" is global GLuint
glBindTexture(GL_TEXTURE_2D, texture);

//LINE BELOW CAUSES ACCESS VIOLATION!
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
    ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT),
    0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());

ilDeleteImages(1, &ilID);
//Again, prints to log file
DebugUtility::gl_log("Succefully loaded and created texture %s", filename.c_str());
} 

ilLoad返回 true,因为该 if 块中的代码未执行。这是错误(我使用的是 Visual Studio 2013):

projectSDL.exe 中 0x74E1CB49 处的未处理异常:0xC0000005:访问冲突执行位置 0x00000000。

4

2 回答 2

5

该功能glTextureParameteri()是一个扩展,尝试使用glTexParameteri()和绑定一个活动的纹理单元glActiveTexture(GL_TEXTURE0)glTextureParameteri()还需要纹理 ID,而不是目标。

于 2014-10-27T14:43:34.937 回答
3

glTextureParameter()是 OpenGL 4.5 中的一个新入口点。它是称为 Direct State Access(通常以首字母缩写词DSA表示)的系列的一部分。在 4.5 中提升为核心功能之前,它是在EXT_direct_state_access扩展中定义的。

这个想法是您可以修改对象的状态而不绑定它们。这可以通过减少 API 调用次数和驱动程序开销来提高效率。

这些新入口点将对象名称作为第一个参数,而相应的旧入口点将目标作为第一个参数。在您的情况下,您要么必须使用较旧的入口点:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

(注意Tex而不是Texture),或者将纹理名称作为第一个参数传递,而不必先绑定纹理:

glTextureParameteri(texture, GL_TEXTURE_WRAP_S, GL_REPEAT);

[警告,这一段是基于意见的,可能会引起争议] 不幸的是,入口点的定义方式很容易与之前的入口点混淆。虽然 OpenGL 从来没有被设计成对程序员特别友好,但我预测会有更多的人被这些新的入口点绊倒,这些入口点与现有入口点的名称非常相似,并且具有相同的签名。对我来说,这看起来像是一个非常不幸的 API 设计。

于 2014-10-27T15:52:35.253 回答