Я заинтересован в написании шейдеров 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();
}