OpenGL几何着色器位运算macOS正常Windows平台失效问题求助
问题原因
你代码里存在两个不符合OpenGL规范的错误,macOS平台的驱动做了兼容处理所以能正常运行,Windows平台驱动严格遵循规范所以触发异常:
- 整数顶点属性使用了错误的配置函数
glVertexAttribPointer是专为浮点类型顶点属性设计的API,哪怕你参数里填了GL_INT,驱动也会把输入的整数转换成浮点值,再传入着色器。着色器中即使声明了int类型的输入,拿到的也是浮点值转整数的结果,和你原本写入的整数值完全不一致。整数类型顶点属性必须使用glVertexAttribIPointer(注意名称中间多了个I)配置。 - 顶点数组对象绑定逻辑错误
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
相关产品推荐
相关产品推荐

