Monthly Archives: January 2014

模板缓冲区

本文主要介绍模板缓冲区的用途,基本用法,主要的操作函数和模板缓冲区在倒影渲染中的应用。 示例代码下载地址:https://github.com/twinklingstar20/twinklingstar_cn_demo_stencil_buffer/ 一. 介绍 所谓的模板缓冲区是做什么用的,举个简单的例子来说明,如图1所示。屏幕上画一个平面,把这个平面写入到模板缓冲区中,再画小球的时候,进行模板测试,小球在平面范围内的内容会显示出来,不在平面范围内的就不显示。假设,把图1中画的平面,看成一扇窗户,而小球看成窗户外面的风景,那么只有在窗户范围内的风景才会显示出来。所谓的模板缓冲区,基本就干这么一件事儿,它在倒影(Reflection)和阴影(Shadow)效果处理上,都起到非常重要的作用。 图1. (1)画一个平面和一个球;(2)启用模板测试,小球不在平面范围内的内容不显示;(3)关闭模板测试,小球在与不在平面范围内,都将内容显示出来 只有存在模板缓冲区的情况下,才会进行模板测试,即将存储在模板缓冲区中的值与参考值进行对比,通过测试的像素才可能在屏幕上显示,而且依赖测试的结果,可能对模板缓冲区中的值进行修改。 OpenGL和DirectX都支持模板缓冲区,每个像素占的位数通常是1、4、8等。渲染过程中,对片断(Fragment)的处理,包括裁剪测试、透明度测试、模板测试、深度测试等等,它们的顺序如图2所示,模板测试发生在深度测试之间。 图2. 每个片断的处理管线 二. OpenGL中与模板缓冲区相关的操作 OpenGL中与模板缓冲区相关的操作,主要有下面几种。 glEnable/glDisable(GL_STENCIL_TEST); glClearStencil(0); glClear(… | GL_STENCIL_BUFFER_BIT); glStencilFunc(function, ref, mask); glStencilOp(stencil_fail, depth_fail, depth_pass); glStencilMask(mask); 默认情况下,模板测试是关闭的,需要调用glEnable()开启模板测试,不用时调用glDisable关系模板测试。 glClearStencil()和glClear()用于清除模板缓冲区。 glStencilFunc设置模板测试比较的条件、参考值和掩码,function可以取的值和意义如下表所示: glStencilOp()用于更新模板缓冲区的操作,模板缓冲区的更新与模板测试的结果和深度测试的结果都有关系,该函数有3个参数,它们的意思分别表示: (1) stencil_fail,规定模板测试失败时进行的操作,默认值是GL_KEEP; (2) depth_fail,规定模板测试通过,但是深度测试失败时的操作,默认值是GL_KEEP; (3) depth_pass,规定了下面有两种情况的操作,默认值是GL_KEEP: i. 模板测试和深度测试都通过 ii.  模板测试通过但是不存在深度缓冲区或者未开启深度测试 glStencilOp()中3个参数可取值和它们对应的意义如下表所示: 三. 倒影

spacer

How AGP Work(转载)

本文转载于http://computer.howstuffworks.com/agp.htm,对AGP进行了介绍。在图形渲染中主要有三种内存:系统内存(System Memory),显存(Video Memory)和AGP内存(AGP Memory)。系统内存和显存都容易理解,不过AGP内存是什么呢?简单来说,就是把RAM中划出一小块内存,当作显存来用,在“AGP Memory Improvements”小节,有详细的介绍。 Introduction You point, you click; you drag and you drop. Files open and close in separate windows. Movies play, pop-ups pop, and video games fill the screen, immersing you in a world of 3-D

spacer

任意点与平面的反射矩阵

问题描述:设三维空间上,存在一个点,一个平面,求点经过平面的投影点,其中,,,如图1所示。 图1. 点是点经过平面的投影点 设表示点到平面的有向距离,则有: 由于点和点到平面的距离大小相等,且垂直于平面,则有: 把(1)代入(2)式中,得到: 设点和点分别用齐次坐标表示(参见《齐次表示》),则,,那么等式(3)可以表示成齐次矩阵与齐次坐标乘积的形式,即,则为:   (4)  

spacer