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

OpenGL几何着色器位运算macOS正常Windows平台失效问题求助

问题原因

你代码里存在两个不符合OpenGL规范的错误,macOS平台的驱动做了兼容处理所以能正常运行,Windows平台驱动严格遵循规范所以触发异常:

  1. 整数顶点属性使用了错误的配置函数
    glVertexAttribPointer是专为浮点类型顶点属性设计的API,哪怕你参数里填了GL_INT,驱动也会把输入的整数转换成浮点值,再传入着色器。着色器中即使声明了int类型的输入,拿到的也是浮点值转整数的结果,和你原本写入的整数值完全不一致。整数类型顶点属性必须使用glVertexAttribIPointer(注意名称中间多了个I)配置。
  2. 顶点数组对象绑定逻辑错误
    VFO是你创建的顶点缓冲对象,并非顶点数组对象(VAO),你在配置属性2之前调用了glBindVertexArray(VFO),相当于直接解除了之前绑定的有效VAO,后续属性2的所有配置都不会写入你需要的VAO中,着色器读取到的属性值是未定义的,因此位运算判断永远不成立,没有任何内容渲染。

修复方案

修改C++中顶点属性配置的相关代码,修正后的代码如下:

int enabledFaces[] = {
    1 << 0, 1 << 1, 1 << 2, 1 << 3
};

unsigned int VBO, VAO, VFO;
glGenBuffers(1, &VBO);
glGenBuffers(1, &VFO);
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// 配置属性0、属性1
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), &points, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));

// 配置整数属性2,不需要重新绑定VAO,使用glVertexAttribIPointer
glBindBuffer(GL_ARRAY_BUFFER, VFO);
glBufferData(GL_ARRAY_BUFFER, sizeof(enabledFaces), &enabledFaces, GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
// 注意这里换成了glVertexAttribIPointer
glVertexAttribIPointer(2, 1, GL_INT, sizeof(int), 0);

glBindVertexArray(0);

另外检查几何着色器开头的版本声明,你代码里写的##version 330 core多了一个#,修正为#version 330 core即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:15:03