第一个OpenGL绘制的在红色的背景上绘制一个蓝色的四边形。程序的输出的结果如下。
![](https://img.haomeiwen.com/i2476070/0931018895a6408d.png)
代码如下:
#include <stdio.h>
#include "GLTools.h"
#include <glut/glut.h>
GLBatch triangleBatch;
GLShaderManager shaderManager;
//窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中的左下角坐标,w,h代表像素
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//为程序作为一次性的设置
void SetupRC()
{
//设置背景颜色
glClearColor(1.0f,0.0f,0.0f,1.0f);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//设置三角形,其中数组vVert包含
GLfloat vVerts[] = {
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,0.5f,0.0f,
-0.5f,0.0f,0.0f,
0.5f,0.0f,0.0f,
0.0f,-0.5f,0.0f,
};
//批次处理
triangleBatch.Begin(GL_TRIANGLES, 6);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
// GLfloat vVerts2[] = {
// -0.5f,0.0f,0.0f,
// 0.5f,0.0f,0.0f,
// 0.0f,-0.5f,0.0f,
// };
// //批次处理
// triangleBatch.Begin(GL_TRIANGLES, 3);
// triangleBatch.CopyVertexData3f(vVerts2);
// triangleBatch.End();
}
//开始渲染
void RenderScenen(void){
//清除一个或一组特定的缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//设置一组浮点数来表示红色
GLfloat vRed[] = {0.0f,0.0f,1.0f,1.0f};
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
triangleBatch.Draw();
glutSwapBuffers();
}
int main(int argc,char* argv[])
{
gltSetWorkingDirectory(argv[0]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
glutInitWindowSize(600,600);
glutCreateWindow("Triangle");
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScenen);
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
SetupRC();
glutMainLoop();
return 0;
}
- 包含的头文件
一般在编写程序之前,都会需要函数和类定义的头文件。此次OpenGL包含了
#include <stdio.h>
#include "GLTools.h"
#include <glut/glut.h>
GLTools包含了大部分GLTools的独立函数。glut/glut.h则适用于APPLE平台中。
- 启动GLUT
一般main函数都是程序的入口
int main(int argc,char* argv[])
设置当前工作目录
gltSetWorkingDirectory(argv[0]);
初始化GLUT库
glutInit(&argc, argv);
然后再告诉GLUT库,创建窗口使用那种类型的显示模型
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
GLUT_DOUBLE为双缓冲窗口,
GLUT_RGBA为RGBA颜色模式,
GLUT_DEPTH为深度测试,
GLUT_STENCIL为模版测试。
接下来窗口大小和以Triangle为标题的窗口。
glutInitWindowSize(600,600);
glutCreateWindow("Triangle");
然后为窗口改变大小设置一个回调函数,再注册一个函数以包含OpenGL渲染代码
glutReshapeFunc(ChangeSize);
glutDisplayFunc(RenderScenen);
在做渲染之前,检查确定驱动程序的初始化没有出现任何问题。
GLenum err = glewInit();
if(GLEW_OK != err) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(err));
return 1;
}
最后一项工作就是调用SetupRC。在这里可以进行渲染。
SetupRC();
最后,主循环结束并结束main函数。
网友评论