OpenGL-01-完整渲染三角形
1. 最开始需要导入3个相关头文件
#include "GLShaderManager.h" // 着色管理器类,可以通过该类创建并管理着色器,并提供了一组“存储着色器”,这个是系统定义好的,我们可以用来进行一些初步的渲染操作
#include "GLTools.h" // 通过名字可以知道,是OpenGL的一个工具类,封装了很多接口函数,方便我们调用实现不同功能
#include <GLUT/GLUT.h> // 系统的一个框架"GLUT.framwork",提供跨平台的OpenGL实用工具
2. 声明2个全局变量
GLShaderManager shaderManager // 声明一个着色管理器
GLBatch triangleBatch // 声明了一个三角形批次类变量,简单的批次容器,是GLTools的一个简单容器类
3. 改变窗口大小
glViewport(0, 0, w, h); // x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是多少像素位,通常x,y 都是为0
4. 清除缓存区,定义渲染颜色并着色
//1.清除一个或者一组特定的缓存区
/*
参数:指定将要清除的缓存
GL_COLOR_BUFFER_BIT :指示当前激活的用来进行颜色写入的缓冲区
GL_DEPTH_BUFFER_BIT :指示深度缓存区
GL_STENCIL_BUFFER_BIT:指示模板缓冲区
*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//2.设置一组浮点数来表示红色
GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
//3.传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标系在屏幕上渲染几何图形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//4.提交着色器
triangleBatch.Draw();
//在开始创建openGL窗口的时候,我们指定一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行。
//5.给后台缓冲区进行渲染,然后结束后交换给前台
glutSwapBuffers();
总结: 清除缓存区->设置渲染颜色->当前着色器进行指定颜色着色->图形批次类变量进行绘画着色->将绘画着色的过程提交给后台缓冲区,着色完后再交换到前台来。 我简单的理解就是一张纸,我们先把场景里的东西清掉,然后选择一个颜色的笔,最后用笔给画好的图形填色。
5. 配置有关参数
//设置清屏颜色(背景颜色)
glClearColor(0.98f, 0.40f, 0.7f, 1);
//初始化着色管理器
shaderManager.InitializeStockShaders();
//指定三角形顶点, 在OpenGL中,三角形是一种基本的3D图元绘图原素。
GLfloat vVerts[] = {
-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(vVerts);
triangleBatch.End();
6. main主函数处理
//设置当前工作目录,针对MAC OS X
/*
<GLTools>函数<glSetWorkingDrectory>用来设置当前工作目录。实际上在Windows中是不必要的,因为工作目录默认就是与程序可执行执行程序相同的目录。但是在Mac OS X中,这个程序将当前工作文件夹改为应用程序捆绑包中的</Resource>文件夹。<GLUT>的优先设定自动进行了这个设置,但是这样的方法更加安全。
*/
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库,这个函数只是传输命令参数并且初始化glut库
glutInit(&argc, argv);
/*
初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区
--GLUT_DOUBLE`:双缓存窗口,是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式,经常用来生成动画效果;
--GLUT_DEPTH`:标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试;
--GLUT_STENCIL`:确保我们也会有一个可用的模板缓存区。
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小、窗口标题
glutInitWindowSize(800, 600);
glutCreateWindow("Triangle");
/*
GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数。我们一共注册2个回调函数:
1)为窗口改变大小而设置的一个回调函数
2)包含OpenGL 渲染的回调函数
*/
//注册重塑函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(RenderScene);
/*
初始化一个GLEW库,确保OpenGL API对程序完全可用。
在试图做任何渲染之前,要检查确定驱动程序的初始化过程中没有任何问题
*/
GLenum status = glewInit();
if (GLEW_OK != status) {
printf("GLEW Error:%s\n",glewGetErrorString(status));
return 1;
}
//设置我们的渲染环境
setupRC();
glutMainLoop();
网友评论