关于用法OpenGL来绘制简单的图形并通过键位控制,我们可以需要用的步骤分为以下部分
- 初始化GLUT库
- 注册自定义回调函数实现进来实现
- 渲染的初始化
- 开启并进入消息循环
1. 初始化GLUT库
//设置当前工作目录,针对MAC OS X
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库,这个函数只是传说命令参数并且初始化glut库
glutInit(&argc, argv);
//初始化GLUT库,传输命令参数 glutInit(&argc, argv); //初始化双缓冲窗口
//其中标志GLUT_DOUBLE(双缓冲窗口)、GLUT_RGBA(RGBA颜色模式)、GLUT_DEPTH(深度测试)、GLUT_STENCIL(模板缓冲区) glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小和标题
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
2. 注册自定义回调函数
//注册窗口改变大小的回调函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(RenderScene);
//特殊键位函数
glutSpecialFunc(SpecialKeys);
glutReshapeFunc(changeSize)
窗口改变大小的回调函数,在第一次运行或者窗口被人为的变化时调用,可以设置程序的视口和投影方式
//在窗口大小改变时,接收新的宽度&高度。
void changeSize(int w,int h){
//x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是像素为表示,通常x,y 都是为0
glViewport(0, 0, w, h);
}
glutDisplayFunc(RenderScene)
显示渲染函数,当屏幕发生变化/或者开发者主动渲染会调用此函数
由系统自动触发和开发者手动调用函数触发,有着清理缓存区(颜色,深度,模板缓存区等),使用存储着色器和绘制图形的功能
void RenderScene(void){
void RenderScene(void){
//清除缓存区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//设置一组浮点数来表示红色
GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
//使用存储着色器,即GLT_SHADER_IDENTITY着色器
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
triangleBatch.Draw();
//在开始的设置openGL,我们指定要一个双缓冲区的渲染环境。缓冲区交换平台将以平台特定的方式进行。
//将后台缓冲区进行渲染,然后结束后交换给前台
glutSwapBuffers();
}
glutSpecialFunc(SpecialKeys)
特殊键位函数,这里用来实现键盘键位控制正方形移动
void SpecialKeys(int key, int x, int y){
GLfloat stepSize = 0.025f;
if (key == GLUT_KEY_UP) {
yPos += stepSize;
}
if (key == GLUT_KEY_DOWN) {
yPos -= stepSize;
}
if (key == GLUT_KEY_LEFT) {
xPos -= stepSize;
}
if (key == GLUT_KEY_RIGHT) {
xPos += stepSize;
}
//边界值检测,这是触碰到边界(4个边界)的处理
if (xPos < (-1.0f + blockSize)) {
xPos = -1.0f + blockSize;
}
if (xPos > (1.0f - blockSize)) {
xPos = 1.0f - blockSize;
}
if (yPos < (-1.0f + blockSize)) {
yPos = -1.0f + blockSize;
}
if (yPos > (1.0f - blockSize)) {
yPos = 1.0f - blockSize;
}
//这是触发重绘的一个API,类似于调用setNeedsDisplay()
glutPostRedisplay();
}
3.渲染的初始化
设置清屏颜色,初始化着色器,设置图元装配方式并传输顶点数据给着色器
void setupRC()
{
//设置清屏颜色(背景颜色)
glClearColor(0.98f, 0.40f, 0.7f, 1);
//没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。
shaderManager.InitializeStockShaders();
//blockSize 边长
GLfloat blockSize = 0.1f;
//正方形的4个点坐标
GLfloat vVerts[] = {
-blockSize,-blockSize,0.0f,
blockSize,-blockSize,0.0f,
blockSize,blockSize,0.0f,
-blockSize,blockSize,0.0f
};
//指定顶点修改为GL_TRIANGLE_FAN ,4个顶点
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
4.开启并进入消息循环
//runloop循环运行
glutMainLoop();
网友评论