我对编写 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();
}