此问题在此处已有答案:
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);
行工作良好,它传递了正确的值。这里会有什么问题呢?
1条答案
按热度按时间0vvn1miw1#
我尝试在同一个绘制调用中渲染多个纹理
你不能
在采样器数组中使用的索引 * 必须 * 是动态统一的表达式。如果表达式在同一个绘制调用中产生不同的值,那么它不是动态统一的。因此,您不能将它用作索引。
数组纹理的层索引可以是非均匀的,但采样器数组的索引不能是非均匀的。