当我想定义纹理时,我必须做一些事情,例如:
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, format, dimensions.x, dimensions.y, 0,
format, GL_UNSIGNED_BYTE, bufferImage.getData());
glGenerateMipmap(GL_TEXTURE_2D);
当我想使用该纹理进行渲染时,我必须这样做:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_normal_texture_info.texture_id);
glUniform1i(m_uniformHandles.normalSampler, 1);
我的问题是,是否必须在纹理加载步骤中设置纹理单元,或者只是在渲染阶段完成一步。可以使用不同的纹理单元渲染相同的纹理ID吗?
答案 0 :(得分:2)
加载纹理时可以使用任何纹理单元。在加载时将纹理绑定到一个纹理单元是完全合法的,然后在渲染时将其绑定到不同的纹理单元。
请注意,始终存在活动纹理单元。因此,在您的第一个代码片段中,您将纹理绑定到恰好是活动的单元(默认情况下为单位0)。如果之前任何其他纹理都绑定到该纹理单元,它将不再被绑定。
除此之外,重要的是将纹理绑定到正确的渲染单元。关键部分是纹理绑定的单位与着色器用于对纹理进行采样的采样器均匀变量的值匹配。
这可能是问题中的拼写错误,但您的代码示例中存在不匹配:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_normal_texture_info.texture_id);
glUniform1i(m_uniformHandles.normalSampler, 1);
这会将纹理绑定到单元0,并将着色器均匀设置为来自单元1的样本。这两个值需要匹配。对于使用单元1,代码为:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, m_normal_texture_info.texture_id);
glUniform1i(m_uniformHandles.normalSampler, 1);