Qt中批量渲染QOpenGLTexture遇问题:仅显示最后一个纹理
问题分析与解决
你的核心错误在于直接将纹理ID传递给sampler2D数组uniform——OpenGL中sampler变量绑定的是纹理单元(Texture Unit),而非纹理对象的ID。你需要先把纹理绑定到不同的纹理单元,再将纹理单元的索引传递给uniform数组。
修正步骤及代码
1. 修正C++端的纹理绑定与Uniform设置
你不能直接传纹理ID,要先将两个纹理绑定到不同的纹理单元(比如GL_TEXTURE0和GL_TEXTURE1),再把纹理单元的索引(0、1)传给uniform数组:
// 绑定纹理到对应纹理单元 m_texture1->bind(0); // 绑定到GL_TEXTURE0单元 m_texture2->bind(1); // 绑定到GL_TEXTURE1单元 // 设置uniform数组:传递纹理单元索引,而非纹理ID const GLint textureUnits[] = {0, 1}; m_program->setUniformValueArray("u_Texture", textureUnits, 2);
2. 片段着色器优化(可选但推荐)
为了避免索引越界导致黑屏,可以添加clamp确保索引在有效范围内:
#version 330 core out vec4 color; in vec2 v_textCoord; in float v_index; uniform sampler2D u_Texture[2]; void main() { int index = clamp(int(v_index), 0, 1); // 限制索引在0-1之间 color = texture(u_Texture[index], v_textCoord); }
额外检查点
- 确认顶点数据中的
v_index值正确:对应第一张图的顶点v_index设为0,第二张图的设为1,确保插值后不会出现异常值 - 检查
QOpenGLTexture的初始化:确认图片加载成功、纹理格式(如RGB/RGBA)与采样器设置匹配,过滤模式和环绕模式配置正确 - 绘制前确保着色器程序已激活(
m_program->bind())
内容的提问来源于stack exchange,提问作者symanoz
相关产品推荐
相关产品推荐

