学习目标:
- 明白可见表面检测的目的
- 知道back-face detection 背面剔除方法
- 知道深度缓冲(z-buffer)方法
- 知道光线追踪(ray-casting)方法
- 能对这种技术opengl编程
可见表面检测
又叫Hidden Surface Elimination隐面消除,只有可见表面应该被栅格化。
当我们查看包含非透明对象和表面的图片时,我们无法从靠近眼睛的对象后面看到那些对象。我们必须删除这些隐藏的表面,以获得逼真的屏幕图像。识别和去除这些表面称为隐面问题。
三种方法
- Back-face detection (also called Culling)
- Z buffer (also called depth buffer)
- Ray Casting
1、Back-face detection 背面剔除
- 简单快速
- 一般在更复杂可见性测试之前用作初步步骤
- 在进一步考虑前消除了大约50%的面
-
如下图,N⋅V < 0 则为背面:
- 有时,v被VPN取代,可以更快地进行近似处理
-
然而,这种方法不能处理凹形物体和部分被重叠的物体
2、Z buffer 深度缓冲
- 有俩buffers,分别是(frame buffer)帧缓冲区和(depth buffer)深度缓冲区。
-
深度缓冲区用于
存储(x,y)位置的深度值
,因为表面被处理(0≤深度≤1)。 -
帧缓冲区用于存储每个位置(x,y)的
颜色值的强度值
。 - 缓冲区存储当前的可见表面信息,一旦发现新的可见信息,值就会更新
-
如下图,s1为可见表面 所以他有最小的depth value
-
算法步骤:
1.初始化深度缓冲区和帧缓冲区,对所有缓冲区位置设置
depthBuff(x,y)= 1.0,frameBuff(x,y)=backgndColor
2.处理每个多边形。一次处理一个。对于多边形的每个投影的(x,y)像素位置,计算深度z(如果未知)。
3.如果z <depthBuff(x,y),计算该位置的表面颜色并设置 depthBuff(x,y)= z,frameBuff(x,y)= surfColor(x,y)
在处理完所有表面之后,深度缓冲区就会包含可见表面的深度值,而帧缓冲区包含这些表面的相应颜色值。
3、Ray casting 光线追踪
- 追踪我们发射出的ray到达的像素点的光路
- 对于每个像素,发射一条经过该像素的光线(从PRP)
- 找到射线与曲面的所有交点
- 最近的交点是该像素表面的可见部分
z buffer | ray casting |
---|---|
用于简单的方程式无法充分描述的对象 | 用于可以通过简单方程轻松描述的对象 |
openGL command
// Back face removal
glEnable (GL_CULL_FACE);
glCullFace (GL_BACK);
//Z Buffer
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glClear (GL_DEPTH_BUFFER_BIT);
glEnable (GL_DEPTH_TEST);
版权声明:本文为qq_41901755原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。