与glPopMatrix的Segfault

时间:2013-12-27 21:51:35

标签: opengl fedora

我在运行Pidora的Raspberry Pi上移植/测试我的代码,全部更新。

测试是一个非常简单的OpenGL程序,在其他两台计算机上运行良好。我将问题缩小到glPopMatrix调用,这会导致段错误。问题的简单再现(整个绘图功能)是:

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glViewport(0,0,200,200);

float d1=0.0f, d2=0.1f;

glPushMatrix(); //gratuitous push/pop pair to demonstrate
glBegin(GL_TRIANGLES);
glColor4f(1.0f,0.0f,0.0f,0.5f); glVertex3f( 0.00f, 1.0f,d1);
glColor4f(0.0f,1.0f,0.0f,0.5f); glVertex3f( 0.87f,-0.5f,d1);
glColor4f(0.0f,0.0f,1.0f,0.5f); glVertex3f(-0.87f,-0.5f,d1);
glColor4f(1,0,0,1);
glVertex3f(0,0,d2);
glVertex3f(1,0,d2);
glVertex3f(0,1,d2);
glColor4f(1,0,1,1);
glVertex3f( 0, 0,-d2);
glVertex3f(-1, 0,-d2);
glVertex3f( 0,-1,-d2);
glEnd();
glPopMatrix(); //segfault here!

我能找到的唯一参考是this 2011 bug report,它有效地描述了同样的问题。到目前为止,似乎他们只有一个解决方法:

export GALLIUM_DRIVER=softpipe
export DRAW_USE_LLVM=no

我发现只有第一行是必要的。但是,如上所述,它似乎可能迫使操作系统使用软件回退。表明。该程序(如上所示绘制三个三角形)以大约10Hz运行。

众所周知,不推荐使用OpenGL矩阵堆栈,但上述简单的用例对测试很有用。我希望glPopMatrix至少不会崩溃,如果它存在的话。有没有办法可以获得硬件加速但仍然使用它?

1 个答案:

答案 0 :(得分:0)

raspberry pi通过特定于供应商的库为OpenGL ES 1.x / 2.x提供硬件支持 - 但桌面GL没有。立即模式(glBegin/glEnd)在GLES中从不。你必须使用顶点数组。但是,矩阵堆栈在GLES1.x中可用。您必须使用egl来获得加速的上下文。从好的方面来说,RPi上的GL不需要X11,所以你可以直接在控制台上安装GL覆盖,非常酷。官方RPi固件附带hello_triangle演示,它演示了如何获得有效的上下文,源代码可以在/opt/vc/src/hello_pi/hello_triangle中找到。还有Ben O. Steen's RPi ports of the examples OpenGL ES编程指南/

您目前正在使用mesa软件渲染器,该渲染器在该平台上速度极慢。崩溃似乎是一个mesa bug,但由于mesa对rpi的GPU没有任何hw accleration支持,这应该不重要。您粘贴的密码是有效的桌面GL1.x / 2.x,不应该在符合要求的实现上崩溃。