当前位置: 首页 > 知识库问答 >
问题:

为glsl中的纹理数组指定绑定

包子航
2023-03-14

在glsl 420中,添加了功能来指定着色器中的绑定,而不必调用glUniform1i。例如:

layout(binding = 0) uniform sampler2D u_Texture;

但是,如何才能为阵列做到这一点呢?

layout(binding ?) uniform sampler2D u_Textures[16];

我希望绑定为0,1,2,。。。,15.如果没有任何glUniform调用,我是否无法在glsl中执行此操作?

共有1个答案

阮桐
2023-03-14

请参阅OpenGL着色语言4.60规范-4.4.5。统一和着色器存储块布局限定符:

当与OpenGL一起使用时,如果绑定限定符与作为数组实例化的统一块或着色器存储块一起使用,则数组的第一个元素采用指定的块绑定,每个后续元素采用下一个连续绑定点。

这意味着您只需指定数组中第一个采样器的绑定点:

layout(binding = 0) uniform sampler2D u_Textures[16];

但是请注意,当采样器聚合到着色器中的数组中时,这些类型只能使用动态统一表达式进行索引,否则纹理查找将导致未定义的值。

我建议使用sampler2DArray(参见Sampler)而不是sampler2D数组。

另请参见:
为什么统一变量在GLSL中不起作用
在片段着色器中,为什么不能使用平面输入整数来索引一个统一的采样数组

 类似资料:
  • 我在Mac OSX下工作,试图通过GLSL着色器在立方体上映射图像。 我显示立方体(以及图像,当它不通过着色器时)的方法是: 正如你所看到的,我正在检查,在这个测试中,是否有一个着色器应用到我的对象上(它是一个包装,效果非常好) 如果没有着色器,我只启用GL_纹理_坐标_数组,如果有,我尝试将图像绑定到着色器中的采样2D均匀。 我使用的着色器非常简单:它只显示纹理。我在Quartz Compose

  • 我正在研究使用无绑定纹理来快速显示一系列图像。我的参考是OpenGL 4.5红皮书。这本书说我可以使用这个片段着色器在着色器中对无绑定纹理进行采样: 我创建了一个顶点着色器,如下所示: 正如你可能注意到的,我对发生的事情的把握有点弱。 在我的OpenGL代码中,我创建了一组纹理,获取它们的句柄,并使它们常驻。我用来获取纹理句柄的函数是“glGetTextureHandleARB”。还有另一个可以替

  • 我正在尝试将多个纹理绑定到片段着色器中的采样器。加载代码似乎运行良好。ATI的CodeXL显示正确加载的纹理。 但是,当我将模型的纹理绑定到活动纹理0和1时,我无法让它将值发送到我的着色器。当我将着色器统一标记为usampler2D并使用uvec4存储颜色时,就像我应该做的那样,因为我的纹理是以无符号字节提供的,我得到了一个全白色的模型。当我将着色器统一更改为sampler2D并使用vec4存储颜

  • 我正在制作一个对象加载器,所有的纹理部分都在不同的纹理文件中。将其映射到模型上的最佳解决方案是什么?我是否需要将每个具有自己纹理的零件视为一个模型,以便最终实体具有多个单独的绘图调用,每个调用具有一个纹理?

  • 在我的程序中,我使用了2种纹理:t0和t1。t1是附加的,仅在某些情况下需要: 绘图着色器: 它的工作原理很好:第二个纹理在需要时首先重叠。假设使用glBindTexture(..,0)返回零纹理(0,0,0,0),但在将NVidia驱动程序更新到314.07后,我的代码会出现黑屏,比如glBindTexture(..,0)返回(0,0,0,1)纹理。 我做了一些测试:使用着色器 我在旧驱动程序(

  • 我正在尝试使用OpenGL GLSL着色器渲染到纹理。首先,我尝试用白色填充30x30纹理的每个像素。我将顶点着色器索引从0传递到899,表示纹理的每个像素。对吗?顶点着色器: 片段着色器: