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

时间:2015-08-26 15:31:52

标签: opengl intel nvidia mesa gldrawarrays

我正在尝试在Intel GPU上运行Piccante图像处理库。该库正在使用OpenGL着色器在图像上应用过滤器。该库根据其文档使用OpenGL 4.0,因此我不得不进行一些小修改,以使其在OpenGL 3.3上下文中运行,该上下文由Intel Mesa 10.3驱动程序支持。

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

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

经过这次修改后,我的程序在nVidia GPU上仍能完美运行,即使在将OpenGL上下文初始化为OpenGL 3.3(核心配置文件)时也是如此。

在英特尔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上初始化上下文时,使用英特尔Mesa 10.3驱动程序在使用nVidia驱动程序正常工作时可能导致程序失败的原因是什么?

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

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我一直在与Piccante图书馆的作者Francesco Banterle交谈,他指出了以下内容:

  

关于英特尔驱动程序,问题在于这些驱动程序的问题   不自动对齐缓冲区,所以我可能需要强制三种颜色   通道是RGBA而不是RGB。

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

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

这似乎解决了英特尔驱动程序的问题。