三角形的颜色,一直在片段着色器中写的,通过程序设置三角形绘制的颜色。
旋转三角形
为了将着色器对象封装的更易于使用,可以创建一个顶点着色器类MCVertexShader和一个片段着色器类MCFragmentShader,它们分别从MCShader类继承。创建不同类型的着色器对象时,只有调用glCreateShader函数传递的着色器类型参数不一样。因此,可以在MCShader类抽象出一个创建着色器句柄的纯虚函数。
前面,我们已经成功创建了一个可执行的着色程序。现在就可使用它来绘制一个最简单的三角形。
顶点属性数据也简称顶点数据。例如顶点的坐标,颜色,法线,以及顶点的纹理坐标等,都是顶点属性数据。
顶点属性数据,分为顶点数组和常量顶点属性两种。
之前我们已经创建并编译了必要的着色器对象,接着就需要将它们连接器起来,创建一个可执行的着色程序
class MCProgram { public: MCProgram(); virtual ~MCProgram();
现代计算机的内存空间都是按照byte划分的,从理论上讲似乎对任何类型变量的访问都可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址上访问,这就是字节对齐。
字节对齐的原因,主要有如下两条:
平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些arm cpu上只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常。
性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
着色器源代码需要经过编译,链接,才能生成可执行的着色器程序,但是着色器的编译器和链接器都是内置在OpenGL库中的。因此我们需要调用OpenGL函数,才能创建出可执行的着色器程序。
本片博文主要是为了在Windows环境下,创建一个空的OpenGL窗口,并且可以使用指定的颜色清除窗口背景。
为了方便后续的代码维护和使用,可以将OpenGL窗口常用的函数封装成MCOpenGLWindow类。在这个类中,先定义OpenGL窗口初始化、窗口大小设置、场景绘制、以及窗口销毁等几个最常用的函数。完成后的类定义如下:
具有Windows编程经验的人都知道,在Windows下用GDI作图必须通过设备上下文(DeviceContext简写DC)调用相应的函数;用OpenGL作图也是类似,OpenGL函数是通过"渲染上下文"(RenderingContext简写RC)完成三维图形的绘制
在创建OpenGL设备上下文之前,必须先引入项目所依赖的opengl32库。在这里按照下面的步骤即可:
本片博文属于Window编程的相关知识,对Windows开发很熟悉的读者可直接无视。
1、打开Visual Studio开发工具,版本可以随便选择,我个人使用的版本是Microsoft Visual studio 2010。
2、从菜单栏中依次选择【文件】—【新建】—【项目】菜单项,打开新建项目对话框;在项目类型列表中选择Win32,模板类型选择Win32控制台应用程序,然后输入项目名称。如下图所示:
模板应该是C++语言中最难的部分。从知名的agg图形库,C++标准库Boost,就可以看到C++模板的强大之处。同时也看到模板存在的一些问题:
不当的使用会造成最终的二进制代码膨胀。
过度使用模板,导致代码易读性不好,并且调试困难。
工程中过多模板,造成工程构建速度奇慢无比。