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

OpenGL绑定双纹理单元仅单纹理渲染的问题排查

问题原因分析与修复方案

以下是导致仅logo.png渲染的两个核心问题:

1. 顶点着色器输入属性位置冲突

顶点着色器中,纹理索引属性a_texindex的layout(location)被错误设置为0,与顶点位置属性a_pos的位置0重复:

layout(location = 0) in vec3 a_pos;
layout(location = 0) in float a_texindex; // 位置冲突!

这会导致GPU无法正确读取纹理索引数据,所有片段的纹理索引值会被错误覆盖或读取无效数据。

修复:将a_texindex的位置设置为2,与CPU端glVertexAttribPointer(2)的设置保持一致:

layout(location = 2) in float a_texindex;

2. 片段着色器错误使用纹理坐标作为索引

片段着色器中,错误地将纹理坐标v_texcoord转换为整数索引,而非使用传递过来的纹理索引v_texindex:

int index = int(v_texcoord); // 错误:使用纹理坐标代替索引

由于纹理坐标的x分量范围是0~1,转换为整数后会被截断为0,导致所有片段都采样第一个纹理(logo.png)。

修复:改为使用v_texindex转换为索引:

int index = int(v_texindex);

额外健壮性优化建议(非直接问题)

  • 在LoadTexture函数中添加纹理加载失败检查,避免创建无效纹理:
if (!pixels) {
    std::cerr << "Failed to load texture: " << filepath << std::endl;
    glDeleteTextures(1, &texture_id);
    return 0;
}
  • 窗口创建失败后终止程序,避免后续无效操作:
if (window == nullptr) {
    std::cerr << "failed to create GLFW window\n";
    glfwTerminate();
    return -1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:26:59