L8J计算机图形学———可见表面检测 openGL入门

  • Post author:
  • Post category:其他



学习目标:

  1. 明白可见表面检测的目的
  2. 知道back-face detection 背面剔除方法
  3. 知道深度缓冲(z-buffer)方法
  4. 知道光线追踪(ray-casting)方法
  5. 能对这种技术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 版权协议,转载请附上原文出处链接和本声明。