4

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

1) 我从位于此处的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。请帮助我了解我正在运行的版本,这样我就可以知道我是否需要跑到商店购买新的显卡,然后我才能确信着色器会运行。谢谢!

PS这是代码:

#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();
}
4

2 回答 2

5

获取 GL 版本的唯一“GL 批准”方式是使用 glGetString(GL_VERSION),这会报告驱动程序支持的 GL 版本。

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

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

于 2011-04-21T11:56:54.773 回答
1

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

于 2011-04-21T08:17:01.010 回答