刚开始学习图形学的时候,就看的是计算机图形学opengl版。那么,我当然也想下载最新版本的sdk。但是发现,官网上只有3.1及其以上版本的文档,无论我怎么找,都找不到相应的sdk。后面,我好像是在pudn上面找到了3.0版本的sdk。将就着用了吧,一直到今天我在看OpenGL编程指南第七版的时候,发现无法使用函数glGenBuffers。好吧,没办法,我只能去找更新版本的sdk。
还是找来找去,发现什么都找不到,但是发现opengl的扩展库倒是不少。比如,glew和glextension之类的。后面发现csdn上有篇博文说,opengl3.1及其之后的版本官方都不提供实现了,所以就找不到那些sdk。有个方法是glew,那么就用它吧。
使用glew也不是那么简单的事情,首先得下载glew,我下载了的是1.9的版本。即使配置成功了,也不一定说就能使用成功了。因为还必须初始化glew,最坑爹的是这个初始化必须在你创建窗口之后,否则一定会失败。
下面给出使用glew的示例代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include "windows.h" #include <glew.h> #include <glut.h> #include <assert.h>
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") #pragma comment(lib , "glew32.lib")
const GLint WINDOW_WIDTH = 600; const GLint WINDOW_HEIGHT = 450; const GLint WINDOW_POS_X = 100; const GLint WINDOW_POS_Y = 100; const char* cszWindowTitile = "primrestart";
void Display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glRectf(0.0, 0.0, 100.0, 100.0); glutSwapBuffers(); }
void Reshape(int nW, int nH) { glViewport(0, 0, nW, nH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, nW, 0, nH); }
int main(int argc, char** argv) { glutInit(argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); glutInitWindowPosition(WINDOW_POS_X, WINDOW_POS_Y); glutCreateWindow(cszWindowTitile); int nRet = glewInit(); if (nRet != GLEW_OK) { MessageBox(NULL, "glew初始化失败", "Error", MB_ICONERROR); return -1; } Init(); glutDisplayFunc(Display); glutReshapeFunc(Reshape); glutMainLoop();
return 0; }
|
从该代码中可以看到,glew.h之前不能包含gl.h,否则编译不过,还有链接上glew.lib,另外最恶心的就是glewInit的正确位置,一定要在创建了窗口(函数调用glutCreateWindow)之后,否则glewInit一定会失败的,glewInit失败了的话,再使用3.1及其以上版本的函数就会出现内存错误了。
最后做下贡献,附录下我的opengl sdk,opengl3.0+glew1.9+一点文档,基本上可以满足要求了。