如何判断一台电脑是否支持OpenGL 2.0? (我想写着色器)

时间:2011-04-21 08:09:27

标签: opengl graphics version shader mesa

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

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

2)我运行了以下命令并获得了:

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

这似乎表明我正在运行OpenGL 1.5,但Mesa版本(据我所知它是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

这对Mesa没有任何说明,并且会让我相信我正在运行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();
}

2 个答案:

答案 0 :(得分:5)

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

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

了解某个HW支持某个GL版本的唯一可靠方法是检查制造商的规格,因为驱动程序可能已过时并支持较旧的GL版本。一个例子是GeForce 8卡,它们最初支持OpenGL 2.1,当OpenGL 3.x出现时,它们也支持它,但只使用更新的驱动程序。

答案 1 :(得分:1)

glxinfo会告诉你你是否真的有硬件加速。使用Ubuntu,您通常需要通过Synaptic明确安装相应的(ATI或NVIDIA)驱动程序以获得硬件加速。