zoukankan      html  css  js  c++  java
  • Interactive 3D GraphicsLesson3 Notes

    公开课的一些笔记。

    三种着色方式

    flat shading: 三角形的顶点没有法向量,三角形整个面才有法向量,打光时整个三角形只呈现一种颜色。
    Gouraud shading: 三角形的顶点都有各自的法向量,打光时三个顶点有各自的颜色,接着做双线性内插 (bilinear interpolation)来求得颜色,使整个三角形有渐层的颜色变化。
    Phong shading: 三角形的顶点都有各自的法向量,先对三角形整个面作法向量的双线性内插,接着打光来求整个三角形的颜色。

    示意图:



    各自的复杂度:

    flat shading的复杂度:N * L
    Gouraud shading: 的复杂度:N * (3 * L + b * A)
    Phong shading的复杂度:(B + L) * N * A
    数学好的人很容易计算出复杂度:Flat<Gouraud<Phong Shading。这裡也因此说明了为何早期电脑都只支持Gouraud shading,就算已经知道Phong shading的效果比Gouraud shading好,但还是选择效能好而效果不错的Gouraud shading!如今GPU发展迅速,Phong Shading的效能已得到提升。


    Screen-Door Transparency

    透明的一种实现-透明纱窗。他用一个b比特纱窗覆盖在物体上面,bit为1就表示这个像素透明。然后在 shading 阶段将相邻像素根据透明度混合起来。

    这个方法最大的优势就是不用考虑物体的顺序,当然,在一些系统中比alpha bending会快很多。


    该方法在实现延迟渲染的初期就仔细调研过,它的优点是可以以统一的方式处理半透明和不透明。但缺点也同样比较致命:

    如果以 4 个像素的方块作为一个混合单元,只能支持 3 层半透明。

    如果光照环境和材质细节较复杂,特别是高光较强时,可以看出明显的颗粒感。且透明层数越多效果越差。


    Alpha Blending

    透明度用alpha表示,取值[0,1],1表示完全不透明,0表示完全透明。

    颜色公式:

    C=Cs*alpha+(1-alpha)*Cd

    Cs表示透明板的颜色,Cd表示目标颜色。


    Z-buffer

    也叫深度缓冲。这是一项处理3D物体深度信息的技术,它对不同物体和同一物体不同部分的当前Z坐标进行纪录,在进行着色时,对那些在其他物体背后的结构进行消隐,使它们不被显示出来。Z Bufer所用的位数越高,则代表它能够提供的景深值就越精确。图形芯片大多支持24bit Z-Buffer而加上8bit的模板Buffer后合称为32bit Z-Buffer。


    Painter algorithm

    画家算法也叫作优先填充,它是三维计算机图形学中处理可见性问题的一种解决方法。当将三维场景投影到二维平面的时候,需要确定哪些多边形是可见的,哪些是不可见的。
    “画家算法”表示头脑简单的画家首先绘制距离较远的场景,然后用绘制距离较近的场景覆盖较远的部分。画家算法首先将场景中的多边形根据深度进行排序,然后按照顺序进行描绘。这种方法通常会将不可见的部分覆盖,这样就可以解决可见性问题。


    Depth peeling

    层次分离技术。用于形状复杂的透明物体的绘制。示意图如下:





    先画第一层,再画第二层...

    层数越多,越逼真。

    Depth peeling可能带来的问题:
    1. 效率降低,且开销不稳定。(pass数量依赖于相机角度,骨骼动画等)
    2. 方案本身带来的复杂性。(如何判断当前有多少层半透明,遮挡查询?)
    3. 无已有的可参考的产品,只有技术demo。


  • 相关阅读:
    网页下载文件
    C++从内存到流
    MapServer的安装和使用
    程序中写个日志
    COM接口映射表
    webgis开源资料
    SQL基础>过滤和排序
    开源的webgis框架总结(转)
    mapserver安装相关
    Python入门,以及简单爬取网页文本内容
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3061833.html
Copyright © 2011-2022 走看看