OpenGL 如何知道将哪个图像单元附加到制服上?

真金

将纹理加载到纹理单元时,我通常必须找到纹理单元的位置并将该单元加载到 unform,其中看起来像这样:

glActiveTexture(GL_TEXTURE0 + texture_unit);
glBindTexture(target, textureID);
//Get the uniform location in the program and attach the texture unit
GLuint location = program->get_uniform_location(uniform);
glUniform1i(location,texture_unit);

但是,我有一个使用 image3D 的程序,我调用将纹理绑定到图像的唯一行是:

glBindImageTexture(image_unit, textureID, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8);

然后在着色器中我将其采样为:

uniform layout(rgba8) image3D image;

vec3 c = vec3(imageLoad(image, ivec3(v_uv,0)));

无论我做了什么更改,这都会输出预期值,因此它似乎工作得很好。这让我想到了我的问题,OpenGL 如何能够uniform layout(rgba8) image3D image;通过使用以下命令来确定将制服附加到图像单元:

glBindImageTexture(image_unit, textureID, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA8);

如果我有多个图像会发生什么?

尼可波拉斯

image在着色器中分配给的图像单位为 0,因为这是您未提供其值的任何统一的默认值。而你没有。在您的情况下, 0 可能是您的image_unit变量的值所以这一切都解决了。

最好通过为图像变量分配绑定来正确执行此操作如果您使用的是现代 OpenGL,您可以使用bindinglayout qualifier将其放入着色器中否则,您必须完全按照您对纹理所做的操作(顺便说一句,您也可以使用binding限定符在着色器中进行分配):使用glUniform1i.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章