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

