Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL如何知道将哪个图像单元附加到制服上?_C++_Image_Opengl_Graphics_Textures - Fatal编程技术网

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

C++ OpenGL如何知道将哪个图像单元附加到制服上?,c++,image,opengl,graphics,textures,C++,Image,Opengl,Graphics,Textures,当将纹理加载到纹理单元时,我通常必须找到纹理单元的位置,然后将该单元加载到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_loc

当将纹理加载到纹理单元时,我通常必须找到纹理单元的位置,然后将该单元加载到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如何能够确定统一
统一布局(rgba8)图像的3D图像将通过以下方式连接到图像单元:

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

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

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


最好通过以下方式正确执行此操作。如果您使用的是现代OpenGL,您可以。否则,您必须完全按照对纹理所做的操作(顺便说一句,您也可以使用
绑定
限定符在着色器中指定):使用
glUniform1i
更改均匀的值,在着色器中指定给
image
的图像单位为0,因为这是您未提供其值的任何统一的默认值。而你没有。在您的情况下,0可能是
image\u单位
变量的值。所以一切都解决了


最好通过以下方式正确执行此操作。如果您使用的是现代OpenGL,您可以。否则,您必须完全按照对纹理所做的操作(顺便说一句,您也可以使用
绑定
限定符在着色器中指定):使用
glUniform1i

更改制服的值是否存在一种偏好?例如,有一种方法更快吗?@Makogan:更快?设置值是您只需执行一次的操作;性能是不相关的。如果要为多个目的回收着色器,则不相关。例如,对无法使用实例渲染且具有不同纹理的不同几何体使用相同的着色器。在这种情况下,您将更改附加到纹理的纹理shader@Makogan:不将纹理或图像附加到着色器。将它们绑定到上下文中的单位,并将这些单位提供给着色器。所以为什么要更改着色器使用的单位?只需将纹理绑定到着色器预期的位置即可。I c,但如果纹理多于纹理单位,是否仍需要更改它们?我的意思是,你有120个不同的对象,每个对象都有不同的纹理,所以你不能一次绑定所有对象,你需要至少更改一个纹理单元绑定,赢了;你不觉得吗?有什么偏好吗?例如,有一种方法更快吗?@Makogan:更快?设置值是您只需执行一次的操作;性能是不相关的。如果要为多个目的回收着色器,则不相关。例如,对无法使用实例渲染且具有不同纹理的不同几何体使用相同的着色器。在这种情况下,您将更改附加到纹理的纹理shader@Makogan:不将纹理或图像附加到着色器。将它们绑定到上下文中的单位,并将这些单位提供给着色器。所以为什么要更改着色器使用的单位?只需将纹理绑定到着色器预期的位置即可。I c,但如果纹理多于纹理单位,是否仍需要更改它们?我的意思是,你有120个不同的对象,每个对象都有不同的纹理,所以你不能一次绑定所有对象,你需要至少更改一个纹理单元绑定,赢了;你呢?