1. 检查自己的OpenGL版本
const char* version = (const char*)glGetString(GL_VERSION);
printf("OpenGL 版本:%s\n",version);
int main_vsersion,sub_version,release_version;
const char* version = (const char*)glGetString(GL_VERSION);
sscanf(version,"%d.%d.%d",&main_version,&sub_version,&release_version);
printf("OpenGL 版本:%s\n",version);
printf("主版本号:%d\n",main_version);
printf("次版本号:%d\n",sub_version);
printf("发行版本号:%d\n",release_version);
glGetString(GL_VERSION);
glGetString(GL_RENDERER);
2. EXT 扩展和 ARB 扩展
EXT 扩展是由多个厂商共同协商形成的扩展,在扩展名字中,“提供扩展的厂商”一栏
将不再是具体的厂商名,而是EXT三个字母。例如GL_EXT_bgra 就是一个EXT扩
展。
ARB扩展不仅是由多个厂商共同协商而成,还需要经过 OpenGL 体系结构审核委员
会(即ARB) 的确认,在扩展名字中,“提供扩展的厂商” 一栏不再是具体的厂商名字,
而是ARB 三个字母。比如 GL_ARB_imaging ,就是一个ARB 扩展。
程序中,判断OpenGL 是否支持某个扩展
#include <string.h>
int hasExtension(const char* name)
{
const char* extensions = (const char*)glGetString(GL_EXECTIONS);
const char* end = extensions + strlen(extensions);
size_t name_length = strlen(name);
while(extensions < end)
{
size_t position = strchr(extensions,' ') - extensions;
if(position == name_length && strncmp(extensions,name,position) == 0)
{
return 1;
}
extensions += (position + 1);
}
return 0;
}
扩展的函数、常量,在命名时与通常的OpenGL函数、常量有少许区别。
扩展的函数。常量将以厂商的名字作为后缀。
比如ARB 扩展 ,所有ARB 扩展的函数、 函数名都以ARB 结尾,常量都以_ARB结尾
glGenBufferARB( 函数)
GL_ARRAY_BUFFER_ARB(常量)
若知道OpenGL 支持某个扩展,则如何调用扩展中的函数,大致的思路就是利用函数
指针。但是不幸的是,在不同的操作系统中,获取这些函数指针的方法各不相同。
使用GLEE, 代码由两个文件组成, 一个是GLee.c, 一个是 GLee.h 两个文件都放到自
己的源代码一起编译,运行时候,GLee 可以自动判断所有扩展是否被支持,如果支
持,GLEE 会自动读取对应的函数。
#include "GLee.h"
#include <GL/glut.h>
示例代码
#include "GLee.h"
#include <GL/glut.h>
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
if(GLEE_ARB_window_pos)
{
printf("支持 GL_ARB_window_pos\n");
printf("使用 glWindowPos 函数\n");
glWindowPos2iARB(100, 100);
}
else
{
GLint viewport[4];
GLdouble modelview[16], projection[16];
GLdouble x, y, z;
printf("不支持 GL_ARB_window_pos\n");
printf("使用 glRasterPos 函数\n");
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
gluUnProject(100, 100, 0.5, modelview, projection, viewport,
&x, &y, &z);
glRasterPos3d(x, y, z);
}
{
GLubyte pixels[5][5][4];
int i,j;
for(i = 0;i < 5;++i)
{
for(j = 0;j < 5;++j)
{
pixels[i][j][0] = 255;
pixels[i][j][1] = 0;
pixels[i][j][2] = 0;
pixels[i][j][3] = 255;
}
}
glDrawPixels(5, 5, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
}
glutSwapBuffers();
}
int main(int argc, char* argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutCreateWindow("OpenGL");
glutDisplayFunc(&display);
glutMainLoop();
}