为什么 glDrawArrays 在 Intel Mesa 10.3 上失败,同时使用 OpenGL 3.3 与 nVidia 一起工作

Why is glDrawArrays failing on Intel Mesa 10.3, while working with nVidia using OpenGL 3.3

我正在尝试 运行 Piccante 英特尔 GPU 上的图像处理库。该库使用 OpenGL 着色器对图像应用滤镜。该库根据其文档使用 OpenGL 4.0,因此我必须进行一些小修改才能使其在 OpenGL 3.3 上下文中达到 运行,Intel Mesa 10.3 驱动程序支持该上下文。

我在创建着色器时更改了以下行(在 buffer_op.hpp 中):

prefix += glw::version("330");  // before glw::version("400")

修改后,即使将 OpenGL 上下文初始化为 OpenGL 3.3(核心配置文件),我的程序仍然可以在 nVidia GPU 上正常运行。

在 Intel GPU 上,程序可以部分运行。只要图像是单通道的,它似乎就可以正常工作。当图像为 RGB 时,绘图现在不再有效,我的图像最终变成黑色。

我已将错误追溯到 (quad.hpp) 中的以下行:

void Render()
{
    glBindVertexArray(vao); // (I checked that vao is not 0 here)
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // glGetError() = 1286 (GL_INVALID_OPERATION)
    glBindVertexArray(0);
}

这是顶点数组对象和顶点缓冲区对象的初始化:

float *data = new float[8];

data[0] = -halfSizeX;
data[1] =  halfSizeY;

data[2] = -halfSizeX;
data[3] = -halfSizeY;

data[4] =  halfSizeX;
data[5] =  halfSizeY;

data[6] =  halfSizeX;
data[7] = -halfSizeY;

//Init VBO
glGenBuffers(1, &vbo[0]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

//Init VAO
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

glEnableVertexAttribArray(0);
glBindVertexArray(0);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); 

这是我正在尝试生成的片段着色器运行:

 #version 330
 uniform sampler2D u_tex_1; 
 uniform vec4 u_val_0; 
 uniform vec4 u_val_1; 
 in vec2 v_tex_coord; 
 out vec4 f_color; 

 void main(void) { 
 ivec2 coords = ivec2(gl_FragCoord.xy);

 vec4 ret = u_val_0;

 f_color = ret; 
 }

我检查了顶点着色器和片段着色器是否成功编译和链接。这是否意味着着色器应该与 GLSL 3.3 兼容并且问题不在着色器内而是在其他地方?

什么可能导致程序在 RGB 图像上失败,而在单通道图像上运行良好?

当上下文在 OpenGL 3.3 上初始化时,什么会导致程序在 Intel Mesa 10.3 驱动程序上失败,而在 nVidia 驱动程序上运行良好?

渲染时似乎有很多原因可能导致GL_INVALID_OPERATION。为了追查错误,我还可以检查哪些其他内容?

非常感谢您的帮助!

我一直在与 Piccante 库的作者 Francesco Banterle 交谈,他指出了以下几点:

Regarding Intel Drivers, the issue is due to the fact these drivers do not automatically align buffers, so I may have to force three colors channel to be RGBA instead of RGB.

加载 RGB 纹理时,我将内部格式从 GL_RGB32F 更改为 GL_RGBA32F:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0,
                 GL_RGB, GL_FLOAT, data); // before GL_RGB32F

这似乎解决了 Intel 驱动程序上的问题。