【问题标题】:Why is glDrawArrays failing on Intel Mesa 10.3, while working with nVidia using OpenGL 3.3为什么 glDrawArrays 在 Intel Mesa 10.3 上失败,同时使用 OpenGL 3.3 与 nVidia 一起工作
【发布时间】:2015-11-20 17:46:09
【问题描述】:

我正在尝试在 Intel GPU 上运行 Piccante 图像处理库。该库使用 OpenGL 着色器在图像上应用过滤器。该库根据其文档使用 OpenGL 4.0,因此我必须进行一些小修改才能使其在 Intel Mesa 10.3 驱动程序支持的 OpenGL 3.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 时,什么可能导致程序在 Intel Mesa 10.3 驱动程序上失败,而在 nVidia 驱动程序上正常工作?

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

非常感谢您的帮助!

【问题讨论】:

  • 最好发布用于初始化顶点数组和缓冲区对象的代码。
  • 谢谢,我添加了代码 sn-ps 用于初始化 VBO 和 VAO。
  • 问题可能出在任何地方。没有可靠的方法将 OpenGL 上下文限制到特定的功能集。即使您获得的上下文版本正好是 3.3,仍然可以根据需要有更高的实现限制,并且应用程序还可能通过扩展访问更新的功能。
  • 您能否还显示您初始化绑定到上下文的纹理的位置?

标签: opengl intel nvidia mesa gldrawarrays


【解决方案1】:

我一直在与 Piccante library 的作者 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多