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

一个纹理阵列的多个采样器

丌官昊天
2023-03-14
  • 如何为一个纹理阵列创建多个采样器

到目前为止,我一直依赖OpenGL来确定声明的uniform sampler2Darray txasampler是指我与glBindTexture绑定的纹理数组。

glTexImage3D(GL_TEXTURE_2D_ARRAY, 0,  GL_RGBA8, width, height,
             layerCount,  0 GL_RGBA, GL_UNSIGNED_BYTE, texture_array);
...
glGenTextures(1,&texture_ID);
glBindTexture(GL_TEXTURE_2D_ARRAY, texture_ID); 
... 
                               //fragment shader
uniform sampler2Darray txa
...
vec2 tc;
tc.x = (1.0f - tex_coord.x) * tex_quad[0] + tex_coord.x * tex_quad[1];
tc.y = (1.0f - tex_coord.y) * tex_quad[2] + tex_coord.y * tex_quad[3];
vec4 sampled_color = texture(txa, vec3(tc, tex_id));

我尝试在片段着色器中指定两个采样器,但片段着色器出现编译错误:

uniform sampler2DArray txa;
uniform sampler2DArray txa2;
...
vec4 texture = texture(txa, vec3(tc, tex_id));
vec4 texture2 = texture(txa2, vec3(tc2, tex_id));

我没想到这会起作用,但是,我不确定片段着色器编译器是否检查采样器是否分配了纹理,所以可能是其他问题。

我尝试生成和绑定采样器对象,但我仍然得到一个片段着色器错误:

GLuint sampler_IDs[2];
glGenSamplers(2,sampler_IDs);
glBindSampler(texture_ID, sampler_IDs[0]);
glBindSampler(texture_ID, sampler_IDs[1]);

我想坚持使用OpenGL的较低版本,有可能吗?非常感谢您的帮助,谢谢!

共有1个答案

云利
2023-03-14

错误是由线路引起的

vec4 texture = texture(txa, vec3(tc, tex_id));

然后,变量“texture”(纹理)的名称等于内置函数“texture”(纹理)的名称。该变量在局部范围内声明,因此在此范围内,texture是一个变量,调用函数texture会导致错误。

重命名变量以解决问题。例如。:

vec4 texture1 = texture(txa, vec3(tc, tex_id));
 类似资料:
  • 使用OpenGL(核心配置文件,4.4),将同一个采样器对象同时绑定到2个不同的纹理单元是否“合法”? 我的测试表明它是有效的,但我不知道我的司机是否原谅了我,或者这是一项功能。

  • 我试图理解OpenGL 4.5中的纹理、纹理单位和采样器。我在附上一张我想弄明白的照片。我认为在我的例子中,一切都是正确的,但我不太确定右侧带有问号的1D采样器。 因此,我知道OpenGL提供了许多纹理单元/绑定点,可以在其中绑定纹理和采样器,以便它们协同工作。 这些绑定点中的每一个都可以支持每个纹理目标中的一个(在我的例子中,我将目标和绑定到绑定点,另一个绑定点)。 此外,采样器可以以大致相同的

  • 在openGL中,可以将一个纹理绑定到两个(或多个)不同的统一采样器吗?使用两种不同的纹理进行渲染时,如下所示: 着色器: 客户: 但当我尝试将一个纹理对象绑定到两个不同的纹理单元时,似乎第一个绑定的单元保持未绑定状态: 当然,可以为两个采样器设置相同的单位,但有时我还想为不同的纹理使用着色器,而不仅仅是为两个采样器设置相同的纹理对象。 这个解决方案实际上运行得很好,但它不符合我所描述的需求。也可

  • 我正在编写一个批处理系统,它跟踪当前绑定的纹理,以避免不必要的调用。我不确定是否需要跟踪特定批次已经使用了哪些纹理,因此如果一个纹理被使用两次,它将被绑定到需要它的第二个采样器的不同TIU。 OpenGL应用程序是否可以在同一着色器阶段内对多个采样器使用相同的纹理图像单元?不同着色器阶段的采样器如何?例如: 片段着色器: 主要节目: 我看不出这不起作用的任何原因,但是如果着色器程序也包括这样的顶点

  • 我对如何将纹理绑定到GLSL中的插槽有点困惑。以下是我的着色器: 当我设置矩阵时,我需要查询统一位置,然后手动设置该位置的值,执行如下操作: 然而,据我所知,我不需要这样做来初始化我的纹理采样器。在设置时,我似乎只需要这样做: 所以,我的问题是,为什么我不需要对纹理进行与矩阵相同的处理?OpenGL运行时如何“知道”我绑定的纹理应该是我定义的采样器?如果我想拥有多种纹理,我该怎么做呢?

  • 问题内容: 我需要将几个数组合并为一个数组。描述我要寻找的内容的最好方法是将阵列“交织”为单个阵列。 例如,从数组#1中取出第一项,然后追加到最终数组中。从数组2获取项目1,然后追加到最终数组。从数组#1获得第二项并追加…等。 最终的数组如下所示: array#1.element#1 array#2.element#1。。。 “踢球者”是各个阵列可以具有各种长度。 是否有更好的数据结构要使用? 问