Как определить, поддерживает ли компьютер OpenGL 2.0? (Хочу написать шейдеры) - PullRequest
4 голосов
/ 21 апреля 2011

Я заинтересован в написании шейдеров OpenGL, но не уверен, достаточно ли хороша моя видеокарта для поддержки этого или правильно ли настроена моя система для использования альтернативы программного обеспечения (Mesa). Как узнать, будет ли мой компьютер поддерживать шейдеры OpenGL? (Я использую Ubuntu 10.04) Я уже пробовал три теста, и я получаю противоречивые ответы для каждого:

1) Я скачал, скомпилировал и успешно запустил шейдерную программу OpenGL из примера кода в OpenGL A 3-я редакция , расположенная здесь . Однако некоторые другие примеры кода из той же главы, которые реализуют другие шейдеры 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 ]

5 голосов
/ 21 апреля 2011

Единственный «одобренный GL» способ получения версии GL - это использование glGetString (GL_VERSION), и это сообщает о версии GL, поддерживаемой драйвером.

Mesa может реализовать любую версию OpenGL, даже если онареализованный в программном или аппаратном обеспечении, в вашем случае у вас есть OpenGL 1.5 IMPLEMENTED MESA 7.7.1, которая является реализацией OpenGL.

Единственный верный способ узнать, поддерживает ли определенное HW определенную версию GL, это проверитьспецификации производителя, поскольку драйверы могут быть устаревшими и поддерживать более старую версию GL.Примером являются карты GeForce 8, изначально они поддерживали вплоть до OpenGL 2.1, а когда появился OpenGL 3.x, они также поддерживали его, но только с использованием обновленных драйверов.

1 голос
/ 21 апреля 2011

glxinfo сообщит вам, есть ли у вас аппаратное ускорение или нет.В Ubuntu обычно требуется явно установить соответствующие драйверы (ATI или NVIDIA) через Synaptic, чтобы получить аппаратное ускорение.

...