使用OpenGL和DIVER调用glTextureParameteri时的访问冲突

n3ipq98p  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(204)

我正在尝试加载一个魔鬼的图像,然后创建一个纹理。我有一个名为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 &sn", 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):

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

wb1gzix0

wb1gzix01#

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

j2qf4p5b

j2qf4p5b2#

glTextureParameter()是OpenGL 4.5中的一个新入口点。它是称为直接国家接入(通常缩写为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设计。

相关问题