1:物体法线向量是一条垂直于某个表面的方向向量,在OpenGL中,可以对每个顶点都设置不同的法线(曲面),物体的法线向量定义了它的表面在空间中的方向,也就是说定义了它相对于光源的方向,在OpenGL中使用法线向量确定该物体的各个顶点所接收的光照,如果需要使用光照,则需要为每个顶点指定一条法线向量。
glBegin(GL_PLOYGON);
glNormal3fv(n0); //带V指的是向量版本,接受一个法线向量,不带V的版本接受三个指定的参数
glNormal3{bsidf};//这个b,s,i版本会对参数值进行线性缩放在[-1.0,1.0]之间
glVertex3fv(v0);
3:我们约定,法线向量的方向指向的是表面的外侧,此时想翻转表面的外侧内侧,将法线的正负改变一下即可
4:法线向量只表示方向,在光照计算时,它的长度会转换为1,若需要对法线向量进行规范化,可以启用glEnable(GL_NORMALIZE)功能,将其恢复为单位长度
5:OpenGL中的图元绘制未免过于复杂,每个顶点需要指定,还需要指定法线向量等等信息,为了解决这样复杂的代码,OpenGL中提供了一些顶点数组函数,允许只使用少数几个数组指定大量与顶点相关的数据,并使用少量的函数调用访问这些函数,这样只需要两个数组就能指定一个多边形的顶点的位置和法线向量了,这样还避免了共享顶点的冗杂性
1:激活(最多可达8个)数组glEnableClientState(),用于存储不同类型的数据,包括:顶点坐标、表面法线、RGBA颜色、辅助颜色、颜色索引、雾坐标、纹理坐标、多表性的边界标识
例如:需要光照时,需要启用法线向量数组glEnableClientState(GL_NORMAL_ARRAY),关闭光照状态时,可以禁用此数组,使用Client是因为这些数组被保存在客户端中
2:将数据放入数组中,这些数组是通过他们的内存地址(指针)进行访问的,一般是glXXXPointer,如glVertexPointer(),每个顶点的间隔是利用一个数组来实现的,glVertexPointer(2,GL_INT,0,Vertices),size:2指的是顶点的坐标数量,GL_INT是数据类型,stride:0是连续顶点之间的字节偏移量,若为0,则顶点为紧密相连,Vertices为数组指针(数组名即为数组的指针)
3:OpenGL通过这些指针从被激活的数组中获取数据
glArrayElement()通常在glBegin()和glEnd()之间调用,否则该函数就会设置所有的启用的数组的当前状态。一般情况下,在这两个函数之间,使用自启用的数组。参数为GL_INT ith,取启用的顶点数组的第i个顶点的数据(0开始)进行绘图
7:重启图元函数:glPrimitiveRestartIndex(),当开始操作大量成组的顶点数据时,可能会需要多次的调用OpenGL的绘图函数,通常可能是在渲染之前的绘图调用中所用过的相同类型的图元:比如三角形(GL_TRIANGLE_STRIP)。重启图元,可以在绘图过程中遇到图元重启索引时,从紧接着索引的顶点开始对相同类型的图元进行一次新的渲染、
8:缓冲区对象:在OpenGL中,我们需要向OpenGL传递数据,由于OpenGL是按照客户机—服务器模式设计的,所以在OpenGL需要数据的任何时候,都必须把数据从客户机内存传输到服务器。如果数据并没有被修改,或者客户机和服务器位于不同的计算机,数据的传输可能就会比较慢或是冗余的。所以OpenGL中增加了缓冲区对象(buffer object),允许应用程序显示的指定把那些数据存储在图形服务器中,3.1版本增加了统一缓冲对象(uniform buffer object)以存储成块的、用于着色器的统一变量数据。
9:顶点数组对象:由于程序增大使用更多的模型,在每帧之间需要多组顶点数组之间切换,这样对顶点的操作就会大量且重复,顶点数组对象捆绑了调用的集合,以设置顶点数组的状态,我们可以通过单次调用在不同的顶点数组之间进行修改