每个OpenGL的程序的程序架构基本相同,具有相同的设计流程
下面简单介绍OpenGL的程序流程:
1、使用OpenGL之前先进行部分设置(此步需要注意,根据调用的OpenGL第三方库不同,程序初始化有一定差异),主要第三方库有Glfw Glew Glut,但是主要的初始化设置包括:库初始化设置、窗口大小设置、OpenGL环境设置
eg:
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512,512);
glutInitContextVersion(4,3);
2、初始化顶点数组对象
主要使用 glGenVertexArrays() glBinVertexArrays()
注意:在程序中产生定点数据时须经过此过程,如果直接读取文件中的数据,则跳过。
3、分配顶点缓存对象
GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
4、将顶点数据载入对象
glBufferData(GL_ARRAY_BUFFER, indexed_vertices.size() * sizeof(glm::vec3), &indexed_vertices[0], GL_STATIC_DRAW);
注:将顶点数据从对象传输到缓存对象中
5、初始化顶点与片元着色器
// Create and compile our GLSL program from the shaders
GLuint programID = LoadShaders( "StandardShading.vertexshader", "StandardShading.fragmentshader" );
此处需要指定两个着色器:顶点着色器(.vertexshader .fragmentshader),使用LoadShader()来加载着色器。
6、使用OpenGL进行渲染
首先,清除帧缓存数据,glClear();
然后,进行绘制
最后,glFush()强制所有进行中的OpenGL命令立即完成并传输到OpenGL服务端处理
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 1rst attribute buffer : vertices
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
vertexPosition_modelspaceID, // The attribute we want to configure
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
7、最后删除缓存区
// Cleanup VBO and shader
glDeleteBuffers(1, &vertexbuffer);
glDeleteProgram(programID);
至此,OpenGL一个程序基本完成