opengl sampler2D的统一数组仅获取1个纹理[副本]

kxeu7u2r  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(135)

此问题在此处已有答案

OpenGL sampler2D array(1个答案)
5个月前关闭。
我想让我的片段着色器接受多个sampler2D以uniform sampler2D u_Textures[3]的形式传入。顶点缓冲区在每个顶点的末尾有一个值,代表从哪个纹理采样(我称之为索引)。我试图在同一个drawcall中渲染多个纹理,但程序只为我给予它的每个索引显示一个纹理。我的片段着色器代码:

#version 450 core

layout(location = 0) out vec4 out_Color;

in vec2 v_TexCoord;
in float v_texIndex;

uniform sampler2D u_Textures[3];

void main() 
{
    int ind = int(v_texIndex);

    out_Color = texture(u_Textures[ind], v_TexCoord);
}

这就是我如何访问“u_Textures”来填充它:

unsigned int loc1 = glGetUniformLocation(sh.getRendererID(), "u_Textures");
GLfloat values[3] = { 0.0f, 1.0f, 2.0f };
glUniform1fv(loc1, 3, values);

这是我如何从我的'Texture'类加载内存中的纹理:

glGenTextures(1, &m_RendererID);
    glBindTexture(GL_TEXTURE_2D, m_RendererID);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer);

以及如何结合纹理:

void Texture::Bind(int slot) const {
    glActiveTexture(slot + GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_RendererID);
}

我创建了2个纹理,并将它们绑定到不同的插槽(1和2),我尝试绘制2个正方形,每个纹理1个。

Texture tex1(path1);
Texture tex2(path2);
tex1.Bind(1);
tex2.Bind(2);

然而,无论我如何改变纹理索引或绑定纹理,输出都是在两个方块中得到相同的纹理。我应该提到int ind = int(v_texIndex);行工作良好,它传递了正确的值。这里会有什么问题呢?

0vvn1miw

0vvn1miw1#

我尝试在同一个绘制调用中渲染多个纹理
你不能
在采样器数组中使用的索引 * 必须 * 是动态统一的表达式。如果表达式在同一个绘制调用中产生不同的值,那么它不是动态统一的。因此,您不能将它用作索引。
数组纹理的层索引可以是非均匀的,但采样器数组的索引不能是非均匀的。

相关问题