OpenGL如何知道将哪个图像单元附加到制服上?
How does OpenGL know which image unit to attach to a uniform?
当将纹理加载到纹理单元时,我通常必须找到纹理单元的位置并将单元加载到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,则可以将其放入带有binding
布局限定符的着色器中。否则,您必须完全按照对纹理所做的操作(顺便说一句,您也可以使用binding
限定符在着色器中分配(:用glUniform1i
更改制服的值。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 不同翻译单元中不可重载的非内联函数定义
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 将QIcon添加到QTableView单元格
- 用于交叉编译和CMake的预处理器宏的单元测试
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 字节真的是最小可寻址单元吗
- C++ 用于单元测试的模板模板
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 提升 1.64 单元测试编译失败
- boost::包含提升单元的元组的哈希值
- 单元测试欧拉到四元数实现失败
- 查找矩阵中单元格的相邻元素
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- OpenGL如何知道将哪个图像单元附加到制服上?