warning: Creating default object from empty value in /mydata/wwwroot/xilinx.eetrend.com/modules/taxonomy/taxonomy.pages.inc on line 33.

OpengGL

用OpenGL绘制平滑着色的三角形与相交区域的混合着色

一、三角形的绘制

在OpenGL中,面是由多边形构成的。三角形可能是最简单的多边形,它有三条边。可以使用GL_TRIANGLES模式通过把三个顶点连接到一起而绘出三角形。

使用GL_TRIANGLE_STRIP模式可以绘制几个相连的三角形,系统根据前三个顶点绘制第一个多边形,以后每指定一个顶点,就与构成上一个三角形的后两个顶点绘制形的一个三角形。

使用GL_TRIANGLE_FAN模式可以绘制一组相连的三角形,这些三角形绕着一个中心点成扇形排列。

第一个顶点构成扇形的中心,用前三个顶点绘制会最初的三角形后,随后的所有顶点都和扇形中心以及紧跟在它前面的顶点构成下一个三角形,此时是以顺时针方向穿过顶点。

二、绕法

在绘制三角形的过程中,三个顶点将三角形封闭的过程是有序的,即三角形的构成路径具有方向性,我们把指定顶点时顺序和方向的组合称为"绕法"。绕法是任何多边形图元的一个重要特征。

一般默认情况下,OpenGL认为逆时针绕法的多边形是正对着的,这一特性对于希望给多边形的正面和背面赋予不同的物理特性十分有用。

OpenGL中FBO的概念及其应用

FBO一个最常见的应用就是:渲染到纹理(render to texture),通过这项技术可以实现发光效果,环境映射,阴影映射等很炫的效果。

OpenGL中的Frame Buffer Object(FBO)扩展,被推荐用于把数据渲染到纹理对像。相对于其它同类技术,如数据拷贝或交换缓冲区等,使用FBO技术会更高效并且更容易实现。

在OpenGL渲染管线中,几何数据和纹理最终都是以2d像素绘制到屏幕上。最后一步的渲染目标在OpenGL渲染管线中被称为帧缓存(frame buffer)。帧缓存是颜色缓存、深度缓存、模板缓存、累积缓存的集合。默认情况下, OpenGL使用的帧缓存是由窗体系统创建和管理的。

在OpenGL扩展中,GL_EXT_framebuffer_object扩展提供了一个创建额外帧缓存对象(FBO)的接口。这个帧缓存的创建和控制完全是由OpenGL完成的,有别于窗体系统创建的默认的帧缓存。与系统默认的帧缓存类似,一个FBO也是颜色缓存、深度缓存、模板缓存的集合(FBO不包括累积缓存),然后OpenGL程序就可以把渲染重定向到FBO中。

这里有一个新的概念需要注意,那就是renderbuffer object。这个对象是通过GL_EXT_framebuffer_object扩展创建。它被用来在渲染过程中为一个2D图像提供渲染目标。

深度测试与深度缓冲

深度测试和颜色缓冲一样,在每个片段中存储了信息,并且通常和颜色缓冲有着一样的宽度和高度,深度缓冲是由窗口系统自动创建的,他会以16,24,32位float 的形式存储他的深度值。在大部分的系统中,深度缓冲的精度都是24位的。

当深度测试(Depth Testing) 被启动的时候,OpenGl会将一个片段的深度值与深度缓冲的内容进行对比。OpenGl会执行一个深度测试,如果这个深度测试通过的话,深度缓冲将会更新为新的深度值,如果深度测试未通过的话,片段将会被丢弃。

深度缓冲是运行在片段着色器之后(以及模板测试之后)在屏幕空间中运行的。屏幕空间坐标与通过OpenGl的glViewport所定义的视口密切相关,并且可以使用GLSL内建变量gl_FragCoord从片段着色器中直接访问。 gl_FragCoord的x和y分量分别代表了片段的屏幕坐标(其中(0,0)位于左下角)。gl_FragCoord中包含了一个z分量,它包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的那个值。

同步内容
--电子创新网--
粤ICP备12070055号