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

OpenGL3.3顶点着色器接收输入但无渲染输出、无片段生成问题求助

可能的故障点按优先级排序:

  • 顶点着色器矩阵乘法顺序错误
    OpenGL默认使用列主序矩阵,正确的顶点变换顺序是矩阵 * 向量,你当前写的vec4(in_pos, 0.0, 1.0) * projection属于行主序乘法逻辑,得到的裁剪空间坐标完全错误,会导致所有顶点落在视口外,没有图元被光栅化。
    修正为:

    gl_Position = projection * vec4(in_pos, 0.0, 1.0);
    
  • 顶点/片元着色器输入输出变量名不匹配
    顶点着色器输出的变量名为ex_texUV、ex_color,但片元着色器对应的输入变量名为in_texUV、in_color,变量名不匹配会导致片元着色器拿到的输入值为未定义值。你原逻辑中只有in_color.a == 0.0时才会给out_color赋值,否则没有输出逻辑,自然不会有像素被绘制。
    统一两边的变量名即可解决。

  • 颜色顶点属性未开启归一化
    你在glVertexAttribPointer中定义颜色属性时,第四个参数设为了GL_FALSE,而颜色输入是GL_UNSIGNED_BYTE类型,取值范围0255,不归一化的话传入着色器的颜色分量会直接转为0.0255.0的浮点数,a通道几乎不可能等于0.0,导致原逻辑的渲染分支永远不触发。
    修正颜色属性的定义:

    glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(DrawVertex), (void *)(sizeof(short) * 4));
    
  • 纹理采样坐标未归一化
    原片元着色器中采样palette纹理时,传入的palvec是整数坐标,而OpenGL默认纹理采样需要[0,1]范围的归一化坐标,直接传入整数会导致采样到错误的纹理值,甚至全透明/全黑。需要根据palette纹理的宽高对坐标做归一化处理,比如256x256的纹理需要写成:

    palvec.x = index / 255.0;
    palvec.y = id / 255.0;
    
  • VBO生成逻辑冗余
    你调用了glGenBuffers(2, &GFXVBO)生成了2个缓冲对象,但后续只使用了1个,可能存在VBO ID绑定错误的问题,如果只需要一个顶点缓冲,修改为glGenBuffers(1, &GFXVBO)即可。

  • 结构体内存对齐问题
    要确认DrawVertex结构体没有编译器自动插入的内存填充,可添加编译指令强制结构体1字节对齐,避免顶点属性偏移错误:

    #pragma pack(push, 1)
    struct DrawVertex {
        short x;
        short y;
        short u;
        short v;
        Color color = 0; //0xRRGGBBAA
    };
    #pragma pack(pop)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:27:00