【发布时间】:2016-11-02 18:12:54
【问题描述】:
我正在尝试使用glTexImage2D() 创建一个不可变纹理,然后我可以使用glBindImageTexture() 进行绑定
这是我的 C++ 代码:
GLuint id;
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
GLint width = 2046;
GLint height = 1086;
// Not sure what to put here 1, 2, 4 or 8 ?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
GLint levels;
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &levels);
for (int i = 0; i < levels + 1; i++)
{
glTexImage2D(GL_TEXTURE_2D, i, GL_R32UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, NULL);
width = glm::max(1, (width / 2));
height = glm::max(1, (height / 2));
// check OpenGL error
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
ALOGE("ERROR_GL_TEXTURE_INIT: %i", err);
}
}
GLint status;
glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_IMMUTABLE_FORMAT,&status);
ALOGE("IMMUTABLE_TEXTURE: %i", status);
glBindTexture(GL_TEXTURE_2D, 0);
glBindImageTexture(0, id, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI);
// check OpenGL error
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
ALOGE("ERROR_GL_TEXTURE_IMG-USE: %i", err);
}
因为我不需要 Mipmap 级别,所以我将 GL_TEXTURE_MAX_LEVEL 设置为 0。
然后我调用glTexImage2D() 设置所有纹理的级别(这里只有一个),我没有出现错误。
不幸的是,glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_IMMUTABLE_FORMAT,&status) 的结果是0,这意味着纹理不是不可变。
现在,当我尝试调用 glBindImageTexture() 时,会引发错误 1282,因为它是在 khronos documentation 中编写的,这个 opengl 函数需要一个 不可变 纹理.
关于我做错了什么有什么想法吗?
提前致谢;)
编辑:
感谢你们的时间和提供的所有信息,但有些事情我不明白。
glTexStorage2D() 人 (khronos documentation) 的这一段让我很困惑:
glTexStorage2D 的行为取决于目标参数。当target为GL_TEXTURE_2D时,调用glTexStorage2D等效于执行以下伪代码,假设没有产生错误:
for (i = 0; i < levels; i++)
{
glTexImage2D(target, i, internalformat, width, height, 0, format, type, NULL);
width = max(1, (width / 2));
height = max(1, (height / 2));
}
由于实际上没有提供纹理数据,
pseudo-code中用于格式和类型的值是不相关的,并且可以被认为是对于所选内部格式枚举数合法的任何值。 internalformat 必须是表 1 中给出的大小内部格式之一,或者是下表 2 中给出的压缩内部格式之一。成功后,GL_TEXTURE_IMMUTABLE_FORMAT的值变为GL_TRUE。 GL_TEXTURE_IMMUTABLE_FORMAT 的值可以通过调用 pname 设置为 GL_TEXTURE_IMMUTABLE_FORMAT 的 glGetTexParameter 来发现。不能对纹理对象的尺寸或格式进行进一步更改。使用任何可能改变纹理对象的尺寸或格式的命令(例如 glTexImage2D 或对 glTexStorage2D 的其他调用)将导致生成 GL_INVALID_OPERATION 错误,即使它实际上不会改变纹理对象的尺寸或格式。目的。
我还不清楚上面的段落是关于glTexImage2D() 还是glTexStorage2D()。
此外,我的基本问题是:我们可以使用glBindImageTexture() 绑定使用glTexImage2D() 创建的纹理吗?
(我看到了这两个函数实际一起使用的代码示例,例如here)
【问题讨论】:
标签: c++ textures immutability glteximage2d opengl-es-3.1