2011-04-21 200 views
4

我有兴趣编写OpenGL着色器,但不确定我的显卡是否足够支持此功能,或者我的系统配置是否正确以使用替代软件(Mesa)。如何判断我的电脑是否支持OpenGL着色器? (我使用Ubuntu 10.04)到目前为止,我已经尝试过三次测试,并且我得到的每个答案都是相互矛盾的:如何判断计算机是否支持OpenGL 2.0? (我想写着色器)

1)我从示例代码中下载,编译并成功运行了OpenGL着色器程序OpenGL A Primer第3版位于here。但是,实现其他OpenGL着色器的同一章节中的其他代码示例不会运行。其中一些甚至导致我的电脑崩溃或输出窗口闪烁的颜色做有趣的事情,很奇怪。

2)我跑到下面的命令,并得到:

$ glxinfo | grep "OpenGL version" 
OpenGL version string: 1.5 Mesa 7.7.1 

这似乎表明,我跑了OpenGL 1.5,但梅萨版本(我的理解是软件实现的OpenGL 2.0,不像硬件中的实际处理那么快,但功能相同)似乎足以运行OpenGL 2.0。我如何知道我的代码使用哪个驱动,OpenGL 1.5或Mesa 7.7.1?

3)我写了一些代码,以输出的OpenGL的计算机上的版本,并得到了以下的输出:

$ ./version 
OpenGL Version major=1, minor=5 
GLSL Version major=0, minor=0 

这并不是说关于梅萨什么,将导致我相信我运行OpenGL 1.5。请帮助我了解我正在运行的是哪个版本,因此我可以知道是否需要运行到商店并购买新的图形卡,然后才能确保着色器运行。谢谢!

P.S.这里的代码:

#include <GL/glut.h> 
#include <stdio.h> 
#include <string.h> 

void getGlVersion(int *major, int *minor) 
{ 
    const char *verstr = (const char *) glGetString(GL_VERSION); 
    if ((verstr == NULL) || (sscanf(verstr,"%d.%d", major, minor) != 2)) 
    { 
     *major = *minor = 0; 
     fprintf(stderr, "Invalid GL_VERSION format!!!\n"); 
    } 
} 

void getGlslVersion(int *major, int *minor) 
{ 
    int gl_major, gl_minor; 
    getGlVersion(&gl_major, &gl_minor); 
    *major = *minor = 0; 
    if(gl_major == 1) 
    { 
     /* GL v1.x can provide GLSL v1.00 only as an extension */ 
     const char *extstr = (const char *) glGetString(GL_EXTENSIONS); 
     if ((extstr != NULL) && 
     (strstr(extstr, "GL_ARB_shading_language_100") != NULL)) 
    { 
     *major = 1; 
     *minor = 0; 
    } 
    } 
    else if (gl_major >= 2) 
    { 
     /* GL v2.0 and greater must parse the version string */ 
     const char *verstr = 
    (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); 
     if((verstr == NULL) || 
    (sscanf(verstr, "%d.%d", major, minor) != 2)) 
    { 
     *major = *minor = 0; 
     fprintf(stderr, 
      "Invalid GL_SHADING_LANGUAGE_VERSION format!!!\n"); 
    } 
    } 
} 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBegin(GL_POLYGON); 
    glVertex2f(-0.5, -0.5); 
    glVertex2f(-0.5, 0.5); 
    glVertex2f(0.5, 0.5); 
    glVertex2f(0.5, -0.5); 
    glEnd(); 

    glFlush(); 

    int major, minor; 
    getGlVersion(&major, &minor); 
    fprintf(stderr, "OpenGL Version major=%i, minor=%i\n", major, minor); 

    getGlslVersion(&major, &minor); 
    fprintf(stderr, "GLSL Version major=%i, minor=%i\n", major, minor); 
} 

void init() {} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("simple"); 
    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
} 
+1

你应该提到你拥有的图形卡! – 2011-04-21 11:54:03

回答

5

获得GL版本的唯一“GL Approved”方法是使用glGetString(GL_VERSION),并且这报告了驱动程序支持的GL版本。

Mesa可以实现任何版本的OpenGL,即使它是以软件或硬件实现的,在您的情况下,您的OpenGL 1.5实现了OpenGL 1.5,这是OpenGL实现的MESA 7.7.1实现的。

知道某个硬件是否支持某个GL版本的唯一方法是检查制造商的规格,因为驱动程序可能已经过时并且支持旧的GL版本。一个例子是GeForce 8显卡,他们最初支持OpenGL 2.1,而当OpenGL 3.x出现时,他们也支持它,但只使用更新的驱动程序。

1

glxinfo会告诉你,如果你真的有硬件加速或没有。对于Ubuntu,您通常需要通过Synaptic明确安装适当的(ATI或NVIDIA)驱动程序才能获得硬件加速。