我有兴趣编写OpenGL着色器,但不确定我的显卡是否足够支持此功能,或者我的系统配置是否正确以使用替代软件(Mesa)。如何判断我的电脑是否支持OpenGL着色器? (我使用Ubuntu 10.04)到目前为止,我已经尝试过三次测试,并且我得到的每个答案都是相互矛盾的:如何判断计算机是否支持OpenGL 2.0? (我想写着色器)
1)我从示例代码中下载,编译并成功运行了OpenGL着色器程序OpenGL A Primer第3版位于here。但是,实现其他OpenGL着色器的同一章节中的其他代码示例不会运行。其中一些甚至导致我的电脑崩溃或输出窗口闪烁的颜色做有趣的事情,很奇怪。
2)我跑到下面的命令,并得到:
$ glxinfo | grep "OpenGL version"
OpenGL version string: 1.5 Mesa 7.7.1
这似乎表明,我跑了OpenGL 1.5,但梅萨版本(我的理解是软件实现的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
这并不是说关于梅萨什么,将导致我相信我运行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();
}
你应该提到你拥有的图形卡! – 2011-04-21 11:54:03