一、渲染:计算机根据模型创建图象。模型(或物体)是由几何图元构成的,而几何图元是通过顶点来指定的。最终渲染的图象由屏幕像素组成。像素(pixel)是显示硬件能够放置到屏幕上的最小的可视元素。有关像素的信息(如颜色)在系统内存中被组织为位面(bitplane)。位面构成了帧缓存(包含图形显示设备为控制屏幕上所有像素的颜色和亮度所需的信息)。
1、使用几何图元建立模型,从而得到物体的数学描述。(OpenGL将点、直线、多边形、图形和位图视为图元);
2、在三维空间排列物体,选择观察场景的有利位置;
3、计算所有物体的颜色。颜色可能是由应用程序指定的、根据光照条件确定的、将问题粘贴到物体上得到的,也可能是上述多种操作的结果;
4、将物体的数学描述和相关的颜色信息转换为屏幕像素,这被称为光栅化。
当我们把绘制的图形传递给OpenGL后,OpenGL还要做许多才能完成3D空间到屏幕的投影。这一系列的过程称为OpenGL渲染流水线。一般的渲染流水线过程有如下几步: 显示列表 求值程序 顶点操作 图元装配 像素操作 纹理装配 光栅化 片断操作
OpenGL工作流程图:
也可以简单的记为:
这是固定管线流程,但是其中顶点处理模块和片元处理模块对于应用程序来说都是可编程的
OpenGL建立三维模型的基本步骤
从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤(括号内表示的是相应的图形学概念)
1 将相机置于三角架上,让它对准三维景物(视点变换,Viewing Transformation);
2 将三维物体放在适当的位置(模型变换,Modeling Transformation );
3 选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,Projection Transformation );
4 决定二维像片的大小(视口变换,Viewport Transformation )。
这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的计算机屏幕上正确显示了。
二、 计算机图形学中,存在一种管线结构,在概念上可以分为3个阶段:应用程序、几何以及光栅。应用程序包括:图元数据遍历,摄像机的移动,物体模型的动画移动,物体可见检查,选择细节等级(LOD);几何主要包括:模型和视点变换,光照与着色,投影,裁减,屏幕映射;光栅为像素(Pixel)正确配色,以便绘制完整图像,该阶段进行的都是单个像素的操作,每个像素的信息存储在颜色缓冲器(color buffer或者frame buffer)中。值得注意的是:光照计算属于几何阶段,因为光照计算涉及视点、光源和物体的世界坐标,所以通常放在世界坐标系中进行计算;而雾化以及涉及物体透明度的计算属于光栅化阶段,因为上述两种计算都需要深度值信息(Z值),而深度值是在几何阶段中计算,并传递到光栅阶段的。
3D世界的大多数高层次方面操作右管线中应用阶段的应用软件负责管理,余下的两个阶段由OpenGL负责管理,顶颜色,光照,材质三个输入在光栅化前控制绘制管线的操作。光照和材质不能单独使用。顶点颜色,光源颜色,材质颜色都有alpha值,它们的alpha经过运算最后会保存在光栅化后的图元 中,也就是说它们的影响也就在上图中红色虚线上方。输入是点(几何坐标、顶点颜色),矩阵,光照(光源,参数),材质,输出是片元。纹理映射的过程的本质是根据纹理信息对片元的再处理,这个过程可能改变片元的alpha值。输入是片元,纹理(纹理坐标、各种参数),输出还是片元。 Alpha值最终通过Alpha混合阶段影响绘制效果,输入时片元,输出是帧缓存颜色值。其管线流程如下图:
【顶装景投光 栅片 纹测混】
意思为:
顶:先在顶点处理器上计算每个顶点的属性(包括坐标,颜色,法向量,纹坐标,以及其他属性如反射方向,折射方向等属性)
装:根据图元的装配方式(虚线,实线,线宽,多边形着色模式等参数)将顶点装配连接成各种图元
景:根据设置好的透视视椎体,裁剪掉那些没有在视椎体中的顶点,他们不纳入计算)
投:将视椎体中的景物投影到近裁面上,根据投影变换矩阵计算每个顶点的齐次投影坐标
光:根据经典光照模型公式,光源的位置,顶点的位置,顶点的法向量,眼睛的位置综合计算每个点的光照颜色,光照公式自己去查)
至此:上面的这些阶段就是"顶点处理程序"的流程
然后是中间的"栅片"阶段,意为让图形硬件根据扫描线"栅出"(即线性插值计算)每个片元的颜色和法向量,纹坐标,这个过程是不可编程的.我们无法控制.
下面是"片元处理程序阶段"
纹:指将纹理按照指定贴图方式(GL_MODULATE,GL_DECAL,GL_REPLACE)贴到每个片元上,计算出每个片元贴上纹理后的颜色
测:指对每个片元按顺序进行剪裁测试、alpha测试、模板测试、深度测试),所有测试通过的片元的颜色将写入帧缓冲区中到屏幕显示。
混:指在最后将片元颜色写入帧缓冲区中的时候根据指定的混色方案如glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)将片元颜色与帧缓冲区颜色混合,OK,整个渲染流程就此结束了。
总结:
1,在每对glBegin()与glEnd()之间即每个图元都要经过一个完整的渲染流程后才会执行到下一条语句去。因此,在此期间可以屏蔽各种硬件缓冲以实现特殊的效果。
2,光栅化阶段前面是顶点处理程序,后面是片元处理程序。但光栅栏化这个过程本身不可以自由控制。
opengl_api兼容模式
1.glDepthFunc();
The test function puts the incoming fragment's depth on the left of the equation and on the right is the depth from the depth buffer
物体的depth op z buffer
2.
glPushAttrib(GL_ALL_ATTRIB_BITS);
我们可以将多组属性或者全部属性(GL_ALL_ATTRIBUTE_BITS)通过函数glPushAttrib压入属性堆栈中,恢复则用glPopAttrib。
glPushAttrib()保存由mask指定的所有属性,把它们压入到属性堆栈中。glPopAttrib()恢复上一次调用glPushAttrib()时所保存的状态变量的值。当glPopAttrib()函数被调用时,所有这些变量的值都被恢复。特殊掩码GL_ALL_ATTRIB_BITS用于保存和恢复所有属性组中的所有状态变量。
我遇到的问题是添加某种物体时,物体的颜色会叠加到天空等物体上,使得天空颜色不正常显示。通过
glPushAttrib(GL_ALL_ATTRIB_BITS)和 glPopAttrib();一组代码,问题解决。
Description
glPushAttrib takes one argument, a mask that indicates which groups of state variables to save on the attribute stack. Symbolic constants are used to set bits in the mask. mask is typically constructed by ORing several of these constants together. The special mask GL_ALL_ATTRIB_BITS can be used to save all stackable states.
The symbolic mask constants and their associated GL state are as follows (the second column lists which attributes are saved):
glPopAttrib restores the values of the state variables saved with the last
glPushAttrib command. Those not saved are left unchanged.
It is an error to push attributes onto a full stack, or to pop attributes off an empty stack. In either case, the error flag is set and no other change is made to GL state.
Initially, the attribute stack is empty.
Notes
Not all values for GL state can be saved on the attribute stack. For example, render mode state, and select and feedback state cannot be saved. Client state must be saved with glPushClientAttrib.
The depth of the attribute stack depends on the implementation, but it must be at least 16.
When the GL_ARB_multitexture extension is supported, pushing and popping texture state apples to all supported texture units.
Errors
GL_STACK_OVERFLOW is generated if glPushAttrib is called while the attribute stack is full.
GL_STACK_UNDERFLOW is generated if glPopAttrib is called while the attribute stack is empty.
GL_INVALID_OPERATION is generated if glPushAttrib or glPopAttrib is executed between the execution of glBegin and the corresponding execution of glEnd.
Associated Gets
glGet with argument GL_ATTRIB_STACK_DEPTH
glGet with argument GL_MAX_ATTRIB_STACK_DEPTH