You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL指定GL_TEXTURE0纹理渲染时错误使用GL_TEXTURE1纹理

问题现象

在learnopengl.com学习OpenGL纹理章节过程中,成功加载2张纹理资源后出现渲染异常:

  • 预期渲染绑定到GL_TEXTURE0的luffy.jpg纹理(对应片段着色器中的luffy采样器)
  • 实际程序输出的是绑定到GL_TEXTURE1的face.png纹理
  • 片段着色器中明确指定采样luffy采样器,结果与预期不符
根因分析

代码中创建纹理对象时调用了错误的API:
两处纹理ID生成逻辑均错误使用了缓冲区对象生成函数glGenBuffers,该函数仅用于生成VBO/EBO这类通用缓冲区对象的ID,无法生成合法的纹理对象ID。正确的纹理对象生成API为glGenTextures。
由于拿到的ID不属于合法纹理对象,后续glBindTexture、glTexImage2D等调用行为未按预期执行,最后一次上传的纹理数据被错误关联到采样器,导致纹理采样串流。

修复方案
  1. 替换两处错误的纹理ID生成代码
    找到原代码中如下错误片段:
uint texture_buffer, texture2_buffer;
glGenBuffers(1, &texture_buffer);
glBindTexture(GL_TEXTURE_2D, texture_buffer);
// ... 第一个纹理参数设置、数据上传逻辑 ...
glGenBuffers(1, &texture2_buffer);
glBindTexture(GL_TEXTURE_2D, texture2_buffer);
// ... 第二个纹理参数设置、数据上传逻辑 ...

将两处glGenBuffers替换为glGenTextures,修改后代码:

uint texture_buffer, texture2_buffer;
glGenTextures(1, &texture_buffer);
glBindTexture(GL_TEXTURE_2D, texture_buffer);
// ... 第一个纹理参数设置、数据上传逻辑保持不变 ...
glGenTextures(1, &texture2_buffer);
glBindTexture(GL_TEXTURE_2D, texture2_buffer);
// ... 第二个纹理参数设置、数据上传逻辑保持不变 ...
  1. (可选优化)补充纹理资源释放逻辑,避免资源泄漏
    在程序退出前的资源清理段,添加纹理对象删除代码:
glDeleteTextures(1, &texture_buffer);
glDeleteTextures(1, &texture2_buffer);
修复后验证

修复后纹理单元与采样器的映射关系会正常生效:

  • 片段着色器中luffy采样器(uniform值设为0)会正确采样GL_TEXTURE0上绑定的luffy.jpg
  • face采样器(uniform值设为1)会正确采样GL_TEXTURE1上绑定的face.png
    指定渲染luffy纹理时不会再串流到face纹理。

内容的提问来源于stack exchange,提问作者Ali Awan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:01:01