查看: 5491|回复: 30
收起左侧

[分享] 图形学这个东西

[复制链接]
caolizhen
发表于 2009-11-9 10:07:12 | 显示全部楼层 |阅读模式
本帖最后由 caolizhen 于 2010-1-17 12:27 编辑

咳咳,昨天又发起烧来了,今天早上起来感觉神清气爽,于是就打算补上自己昨天的承诺。
周一了,因为我们班发烧人太多,所以自己就只得呆在家里了,这周还期中考试。。。。。好了,家常到此结束


计算机图形学和系统结构都是大四才会开的选修课程,需要一定的线性代数基础,说实话一开始我都不知道怎么去写这篇文章,因为里面涉及的计算公式对于没有较好基础的朋友是完全没有可能明白的,不过如果简而言之,能让大家明白网络上流传的一些GPU架构分析文章,也许就不那么困难了。我写的东西不可能让大家通晓一门学问,也不会让大家的编程能力大大提升,仅仅是开阔视野罢了,有兴趣深入的朋友,去大学选修吧!!

章节简述

1 图形管线(pipeline,就是之前的流水线啦)

2 外观与视觉

3 纹理贴图

4 光照与着色

5 加速计算技术与管线优化

6 硬件的基础


请给我机会占6楼,3Q。。。。。。鄙视插楼


最后说几句,要认真看,仔细思考哦。


[ 本帖最后由 caolizhen 于 2009-11-9 10:50 编辑 ]

评分

参与人数 3魅力 +1 人气 +2 收起 理由
foreverhyx + 1 感谢小鱼分享
永远Ъù分手 + 1 精品文章
Daigo + 1 鄙视偶……偶也鄙视乃一下……

查看全部评分

caolizhen
 楼主| 发表于 2009-11-9 10:07:38 | 显示全部楼层
第一章 图形管线

附言:第一章的内容可是最重要的,对于图形学来说,这是一个基础,它并不是讲如何具体实现一些功能,而是让人们深入理解图形绘制的具体功能。

1.1 体系结构

       在现实的世界里,管线的表现方式非常多,比如输油的管线,工厂的流水线等等,对于图形学来说,也有管线的概念。
       一条管线包括多的阶段,无论其中的个别管线速度有多快,管线整体的快慢程度都是由其中最慢的那个部分所决定的,就好象一根粗细不均的绳子,他的强度决定于最细的那个部分。理论上,如果要把一个管线结构分成n个处理阶段,那么它就可以提升n倍的速度,例如在游乐园中的过山车上增加更多的座位,就能提高一次运行的收入,当然实际运行的话是没有如此顺利的,比如我们要考虑过山车的安全性,稳定性,还要具体分析承载人数和耗损能源的关系,有时候情侣喜欢坐在一起,那么可能就会造成一定影响。有时候陌生的男女不想互相拥挤在一个狭小的空间,同样也会造成影响。当然这都是通俗的说法,在我连载的CPU工作原理中对流水线(也就是图形学中的管线)进行了详细的阐述,有兴趣的朋友可以去阅读。
       在计算机图形学中,管线在观念上被划分为三个阶段,即应用程序阶段,集合阶段和光栅阶段(比较粗略的划分)。每个阶段本身可能是一条管线,也可能是多条,而且,我们还可以对有的阶段进行部分或者全部并行操作。如同字面的意思那样,应用程序来驱动,所以可以利用软件来实现。第二阶段是集合阶段,根据GPU体系结构,可以用软件或者硬件来实现,此阶段主要是计算我们需要绘制的内容,如何绘制和怎么样绘制,也就是是什么,为什么,怎么样。最后的光栅阶段是利用之前产生的数据进行图像绘制。当然这只是简述,接下来我们会重点讨论。
       最慢的管线阶段决定绘制速度,也就是图像更新的速度,我们一般用fps来表示,也就是每秒绘制的图像数量。

1.2 应用程序阶段

        由于应用程序阶段是通过软件实现的,因此工程师能够对这个阶段进行完全控制,可以改变一些实现方式从而提高性能。
        在应用程序阶段的末端,将需要绘制的几何体输入到绘制管线的下一个阶段。这些集合体都是绘制图元,例如点,线,二维图形),最终需要的将会在屏幕上显示出来,这也就是应用程序阶段最重要的任务。
       在应用程序阶段,通常的实现方法有碰撞检测。当检测到两个物体之间存在碰撞关系是,就会产生一个数据并反馈给碰撞物体,就好象汽车的安全气囊一样。在这个阶段实现的其他过程还包括纹理动画,几何变形和仿真变换。

1.3 几何阶段

     几何阶段负责大部分多边形和定点操作,可以将这个阶段进一步划分(模型与视点变换~光照~投影阴影~裁剪~映射)。有时候一个阶段可以划分为更细小的阶段,这取决于GPU本身的架构。例如,在一种极端情况下,整条管线中所有的阶段都可以用软件来实现,这样可以认为整条管线是由几个管线阶段组成的,另一种极端情况下,可以将每个功能阶段分成若干个更细小的阶段,每个阶段可以在设计好的浮点处理单元中执行。
     特别注意的是,集合阶段执行的计算量非常高,例如在只有一个光源的情况下,每个顶点大约需要100次左右的精确浮点操作。

1.3.1 模型与视点变换
       在屏幕上显示的过程里,模型通常需要变换到若干个不同的空间或者坐标系中。起初,模型出于自身所在的空间里,可以简单的人为他没人进行任何的变换,每个模型可以和一个模型变换相联系,这样他就可以进行定位与定向。同一个模型还可以和几种不同的模型变换联系在一起。允许同一个模型拥有更多个变换空间(我们称为副本),可以在同一场景中具有不同的位置,方向,大小,而不需要对基本几何体进行复杂的变换操作。
       模型变换的对象是模型的顶点和法线(欧氏几何,不多讲,高中向量知识过关基本就可以的)物体的坐标成为模型坐标,如果将模型变化应用到这些坐标中,那么可以说这个模型位于世界坐标或世界空间中。世界空间是确定的,唯一的,所有的模型经过变换以后都可以位于同一个空间中(这里的空间是指我们视觉上的)。
      正如前面所描述的,只对视点可以看到的模型进行绘制(有些技术还可以将距离视点较远的模型模糊化处理)。为了方便投影和建材,必须对视点和所有模型进行视点变换。变换的目的就是要让视点固定不动,然后进行视点校准,使其朝向z轴(深度轴)的腐防线,y轴指向上方,x轴指向右边。在视点变换后,实际位置和方向就依赖于当前的应用程序接口API了,上述描绘的空间被为观察空间。所有的模型变换和视点变换都用一个4*4的矩阵来实现的哦。

1.3.2 光照与着色
       光秃秃的模型可不是我们想要的,为了让其看上去更加真实,可以给场景配上一些光源,同时还可以选择是否是灯光影响几何体的外观,几何模型可以由于其每一个顶点相关联的颜色或覆盖畦上的纹理(一幅图像),这样能让模型更加真实。
       对于受光源影响的模型来说,可以用光照方程来计算模型上每个顶点的颜色,在现实的世界中,光源发射光子,然后被表面反射或者吸收,在图形学中可没有那么多时间用来模拟,甚至有些游戏都是固定的阴影........此外,模型在图形上通常以三角形表示,目前大部分GPU都是采用三角形这种几何图元。物体表面每个顶点的颜色可以由光源及其特征,顶点的位置和法线,顶点所在的材质属性来计算。当在屏幕上绘制三角形时,可以通过对三角形顶点的颜色进行插值从而减轻GPU的负担,往往能获得较好的优化效果。

1.3.3 投影
       在进行完光照处理后,绘制系统就要开始进行投影操作了,目的是将视体变换为一个单位立方体。这个立方体的对焦顶点分别是三个负一和三个正一。通常我们称之为规范视体。目前流行的有两种投影方法,即征投影和透视投影。
      正投影通常是一个矩形的盒子,它可以把这个视体变换为单位立方体。正投影的主要特性是平行线在变换之后彼此之间依然保持平行,这种变换是平移与缩放的组合。
      相比之下,透视投影要更为复杂一些,相信有美术功底的朋友都知道想掌握好透视并非易事,这种投影方法,当物体距离视点越远,那么投影之后就会变得越小。此外,平行线可以在地平线处相交。从几何上来说,视体也被称为椎体,即一个以矩阵为地面的被截了的金字塔。正投影和投影投影都可以通过4*4的矩阵来实现,在经过任何一种变换之后,都可以认为模型位于归一化处理之后的坐标系中。
      注:这种变化把一个体变换为另外一个体,它是一种投影形式,因为在投影之后产生的图像中的z坐标系不会存在了,将2维变成了3维。

1.3.4 裁剪与屏幕映射

      只有当图元完全或者部分存在于尸体内部的时候,才需要将其发送到光栅阶段,这个阶段可以把这些图元在屏幕上绘制出来。当一个图元完全位于一个视体内部的时候,它可以直接进行光栅操作,但如果并非完全位于视体内部,那就要裁剪一部分再交给光栅操作了。
      只有在视体内部经过裁剪的图元才可以进入屏幕映射阶段,进入到这个阶段的时候,坐标依然是三位的。每一个图元的xy坐标变换到了屏幕坐标系中,屏幕坐标系联同z坐标一起称为窗口坐标系。有时候为了让图像进行移动或者缩放,都是改变其xy值得到的,z轴始终不会改变

1.4 光栅化处理

       给定经过变换和投影之后的顶点,颜色以及纹理坐标(均来自于几何阶段的操作数据),光栅阶段就是给每个像素正确配色,以便正确绘制整幅图像的,这个过程称为光栅化(有的还叫做扫描转换),也就是把屏幕间的二维顶点转化为屏幕上的像素。。屏幕空间中有一个z值,一种或几种颜色,以及一组或者多组纹理坐标,其中纹理坐标会于顶点或者屏幕上的像素联系在一起,不想几何阶段那样进行的是单个多边形操作,光栅操作进行的是单个像素的操作。每个像素的信息存储在颜色缓冲器里,颜色缓冲器是一个矩阵的颜色序列(每一种颜色都可以拆分为红,绿,蓝)。对于那些高性能的GPU来说,光栅阶段必须在硬件中完成,软件操作可是异常困难且艰辛的。
       为了避免用户体验到对图元进行处理送到屏幕的过程,图形系统使用了双重缓冲机制,这意味着屏幕绘制是在一个后置缓冲器中以与屏幕分离的方式进行。一旦屏幕移栽后段缓冲器绘制,后端缓冲器中的内容就不断与已经在屏幕上显示过得前置缓冲器中的内容进行交换(注意哦,这不是当前帧和下一阶段帧)。
       此外,光栅阶段还负责可见性问题,这意味着当绘制完整场景的时候,颜色缓冲器中应该包括从视点处可以观察到的场景图元。对于大多数GPU来说,这个过程是通过Z轴缓冲器算法实现的(如果不在Z缓冲器,就可以使用BSP树按照从后往前的顺序绘制场景)。Z缓冲器和颜色缓冲器的形状大小类似,每一个像素都会有其对应的Z值,这个值是通过从视点到最近图元之间的距离。当将一个图元绘制为相应的像素时,需要计算像素位置处于图元的z值并与同一个像素的Z缓冲器的内容进行比较。如果获得的z值远远小于z缓冲器中的z值,那么就说明即将绘制的图元与视点的距离比原来距离视点最近的图元还要近,同样的道理,如果要远远大于的话,那么就是还要远咯。这样,像素的z值和颜色就由当前图元对应的z值和颜色进行更新。如果计算出来的z值远远大于Z缓冲器中的z值,那么颜色缓冲器和Z缓冲器就不便。Z缓冲器的算法非常简单,只要对每个图元可以计算出相应像素的z值,就可以使用这种算法而不需要更多的变换。需要注意的是,在这个算法中,像素绘制的顺序可以是任意的,这也是它能够得到广泛应用的一个重要原因,这样才能让硬件的效率进一步提高:但是,不能按照任意顺序对部分透明的像素进行绘制,必须在所有非透明像素绘制之后才进行,而且必须按照从后道歉的顺序。
       在三维场景的绘制中,纹理是一种能提高真实感的有效技术,这个问题需要进行详细的讲解。简单的来说,对一个物体进行纹理贴图就是把一副图像贴到该物体表面上。纹理图像可以是一维,二维或者三维的,其中二维图像最为普遍,目标物体可以是一系列连在一起的三角形,也可能是一些线段,四边形,球体等等等等多种图案。
       前面已经提到过,颜色缓冲器用来存储颜色,Z缓冲器用来存储每个像素的z值。但是,还可以使用其他缓冲器来产生一些图像的不同组合,alpha通道和颜色缓冲器联系在一起可以存储一个与每个像素相关的不透明值。模板缓冲器作为OpenGL的一个部分,通常每个像素包括1~8个比特(储存单位,别告诉我你不认识),可以通过各种函数将图元绘制到模板缓冲器中,其中的内容可以用来控制颜色缓冲器和Z缓冲器绘制。做个比方,假设已经将一个实心圆绘制到模板缓冲器中,现在就可以和一个操作符结合起来,该操作符允许将一系列图元绘制到只存在圆的颜色缓冲器中在特殊效果生成方面。模板缓冲器是一种强大的工具。
       真缓冲器通常包括一个系统所具有的所有缓冲器,但是有时候却认为是颜色缓冲器和z缓冲器的组合,在1990年,有两位大侠提出了另外一种缓冲器,被称为积累缓冲器。在这个缓冲器中,可以用一组操作符对图像进行积累,我们平时看到的动态模糊就是利用这种技术实现的。

END

[ 本帖最后由 caolizhen 于 2009-11-21 20:28 编辑 ]
caolizhen
 楼主| 发表于 2009-11-9 10:08:18 | 显示全部楼层
本帖最后由 caolizhen 于 2010-2-20 21:29 编辑

刚才firefox挂了,然后我的字啊。。。。。。算了,再一遍,这次用wps

听很多网友反应文章没有意思,知识性太强,于是我打算转型,这一章我会用更加让人接受的说法和语言,希望大家多多指出我的不足啦,这是测试版啊!!!


第二章 视觉  外观




2.1 光源
       提到光,就不得不说波粒二象形,也就是光具有粒子和波的双重性质,在量子论中有光子一旦被观测就萎缩的说法,和某对论中的光速不变一个样,没有原因,好像真理一般的存在。因为光是波,所以它的衰减速度是到光源的距离的平方,不过在实际的绘制中,光不随距离而衰弱,这样就比较容易控制光照效果,而且可以将其很快的计算出来。
在西方绘画中对暗面亮面的处理可以更加充分的将表现的物体传达给我们,因为太阳离我们太远了,所以太阳光实际上是一种平行光,明暗的变化更能让人们感觉,恩,这是真实的。真实性也便是图形学不断努力的一个方向。光源除了平行光,还有点光,类似一个正电荷的电场线向外四射。当然还有聚光源,这也是光的波的性质的很好的表现,
大家可以联想手电筒哦。
       所有的三种光源都具有强度参数,光源一般不仅仅具有亮度强度,还带有颜色,在图形学中我们用RGB的值进行描述。


2.2 材料

       材料是一种较为通俗的说法,正确的叫法是材质,好像镜子可以反射99%的光而黑体能吸收所有的光一样,材质实际上是一种参数,它规定这层材料可以反射多少光,吸收多少光,还有漫反射镜面反射等等。


2.3 光照 着色

       光照是啥?可不是之前的光源啊,它是用来表示材料和光源之间的相互作用的,也可以表示光源和绘制几何图形对象之间的相互作用。着色处理是计算光照并由此决定像素颜色的过程,目前有很多种处理方法,这里简单较少一下Gouraud处理方法,首先我们要计算三角形的每个顶点处的光照,然后用顶点颜色通过插值来计算三角形内部的光照,
有时候也会将表面细分成为小片段,然后对每个小片段进行绘制,不过后者所需要的时间较多,不如插值来的快。
       实际绘制中光源具有不唯一性,而且现实中不仅仅只有太阳光,而且反射的形式较多,所以光照处理绝非想象的那样简单,光照中有漫反射,镜面反射,环境光影响,综合起来才是我们需要计算的光照,计算的复杂度绝非难以想象,别看你在游戏中GPU以每秒几十帧的速度渲染很轻松,如果让一个常人去计算这些方程,估计这个时间内你就能跑出银河系了。


2.4走样,反走样

      走样是啥?可能一部分朋友第一次见到这东西,不过如果说锯齿可能就比较好理解了,AA同样也是,想当年无数显卡倒在了全高+高AA的孤岛危机中,时至今日似乎也没有真的可以征服它的民用单路GPU出现。先不说具体如何消除狗牙,请大家想想一个大黑色三角形在白色的背景上慢慢移动,当三角行覆盖屏幕网格单元时,表示该网格单元的像素值在强度上会平滑下降。实际情况就是,当覆盖网格单元的中心时,像素颜色会立刻由白变黑。
      事实上,大多数GPU在默认是会出现这种情况,显示出来的多边形出现了不规则排列,对于直线也同样成立。正因为如此,图形边缘看上去参差不齐,这就是所谓的狗牙啦。关于具体的对应措施,太多了,下次吧。。。。。。。

特别的一版,纪念12月末,新的一年的即将到来

12月末的寂寞
       12月末,总是让人感叹,遥想去年的小沈阳,似乎刚刚过去,而现在竟然已经一年了。这个帖子,算上CPU工作原理,也有半年多载的时间。在这里真的很想对一直支持我的朋友说一声谢谢,是你们给我继续下去的理由,是你们给予了我努力的冲动。我只是一个什么都不懂的小孩子,依靠所谓的“技术”“专业”来吸引别人的眼球,也许我还是原来那么无知,那么自大,但是谢谢大家一直的关注,我也会不断提升自己,分享给大家自己的见解的。
       顺便一提,最近很多新番已经结束了,比如学生会的一存,圣剑锻造师还有猫愿。去旧迎新嘛,在这里我不得不引用danger猴子(卡饭 BBT帮主),也就是基拉大神的一句话,“为了明天而战!”




2.4 ~~~~
       最近比较忙,学业水平考试,上一周没来的及写,这次俺补上。好了,感情的话题放到一边吧,我们来回顾一下上次的内容。
       狗牙,锯齿,走样,实际上都是同样的一个意思,就是指在图像边缘上不平坦不光滑的“小皱纹”,这玩意甚是伤眼,让人们感觉不到所谓的真实。所以,对于这种讨厌的东西,我们必须要用什么技术把它消除掉,所以,反走样技术应用而生。
       很多朋友在玩最新的游戏大作时,总是不敢去开启反锯齿,因为自己的显卡性能太差,而且反锯齿对帧数,也就是流畅度的影响极大,小小的锯齿竟然有如此大的性能消耗?下面就是见证的时刻!
       就图形绘制的过程来说,它实质上是一个采样过程。这是因为图像的生成就是对三维场景进行残阳的过程。为了得到图像中每一个像素的颜色值,我们需要对三维场景进行采样。为了更好的纹理映射(你可以理解为贴图),还需要对像素单元进行多重采样,这样才能做到真实。为了生成动画图像中的图像序列,通常需要对动画进行等时间间隔的采样(联想数据预取)。这里介绍采样,重建和滤波技术,其他具体的算法可以通过谷歌的学术文章搜索器寻找。
       不管是数学也好,还是语文也罢,都是从最基本的问题开始思考,我们同样,三维形式较为复杂,先从一维开始,那么推广到更高的维数也便很简单了。
       对一条连续的信号,我们的采样方式就是对其进行分割,然后得到一些特殊值。如果对音响有了解的朋友也许不陌生。如果用更数学的方式去表现,就是仅仅取得一条信号(函数)中的几个特殊值,从而根据这些特殊值重建信号。不论什么时候进行采样都会产生令人讨厌的狗牙,那就必须要去解决啦。现实中,有一个比较经典的走样示例,也就是电影摄像机拍摄的旋转圆轮序列,由于圆轮的旋转速度要比摄像机记录图像的速度快得多,因此圆轮看起来旋转的比较慢(相对性运动),或者看起来根本不转动。之所以产生这种效果,是因为圆轮图像按照一组时间间隔进行抽取。在图形学中,走样一般的现象就是光栅化线条的锯齿,在缩小棋盘格状的纹理图像时,也会产生走样。
       当信号采样频率过低时,经常会出现锯齿,采样信号看上去要比原始的信号的频率低,要想得到比较好的采样信号,采样频率必须大于被采样信号最高频率的两倍,如此大的开支,当然我没还没有考虑其他部分的影响。最高频率的意思再详细解释一下,就是必须对信号限制带宽,也就是说必须存在一个上限频率,没有比上限频率还高的信号。另一个方面,相邻的两个采样点之间,相对于见个,信号必须足够光滑。
       在使用电采样绘制三维场景的时候,一般部队场景进行带宽限制。但是多边形的边缘,阴影边界以及其他的一些现象会产生非连续变化的信号,这时候的频率就是无限大的。此外,不管采样距离多效,物体依然可以小到根本无法采样的程度,也就是频率为0.因此,在使用电采样绘制场景的时候,就不可能避免走样,也就是锯齿的问题。不过,有的时候我们依然可以知道何时信号具有带宽限制。比如,当物体表面进行贴图的时候,与像素采样率相比,应然可以计算纹理样本频率。


2.4.1 重建

      首先假设已经对带宽受限型号采样完毕。接下来就要讨论如何将这些采样信号重建原始信号,为此,我们需要用到滤波器。   

箱式滤波器:这种滤波器效果十分的差,因为得到的信号结果是非连续的阶梯状。但是因为形式上十分简单,所以在图形学中依然广为使用。像是滤波器对每个采样点都会进行处理,然后进行比例调整,使得滤波器的最高点和样本点一致,所以这些经过放缩和平移的箱式函数之和就是重建出来的信号了。
  
三角滤波器:这种滤波方式有点类似前者的升级就是在相邻采样点之间进行了线性插值,效果也会好一些,图像信号也会是连续的。然而这种方式得到的重建信号光滑度并不咋样,在采样点处会出现突然的斜度变化。为了得到满意的结果,必须使用理想的低通滤波器,信号的每个频率分量都应该是一个正弦波,也就是sin(2πx),其中x是该分量的频率。这样,与滤波器定义的特定频率相比,大的频率分量都会被滤过掉。从直观上将,就是低通滤波器可以出去信号的尖锐特值(为什么是sin滤波器呢?如果了解傅立叶分析的朋友也许可以明白,这似乎是高数内容,感兴趣的朋友可以回顾一下自己的高数课本哦)。

使用sin滤波器可以获得一个连续的信号,然而在图形处理中并不能使用连续信号,不过可以用它们进行重采样,得到另一个尺寸的信号,不过这就是下次的话题了。



2.4.2 重采样

废话不多说,进入正题

重采样这个技术就是对样本爱养信号进行放大或者缩小。假设原始样本点都处在整数值的坐标值上,也就是说样本点之间的距离都是一个单位,更进一步来说,假设在重采样后需要均匀定位新的样本点,样本点间的距离就是a。如果a大于1,那么信号就被缩小了,这个可以叫做见采样:同样的道理,如果a小于1,信号就被放大了,相对的就是过采样。也许有的朋友还是不理解,这里再解释一下,因为样本点的采样距离缩小,采样精度也便提高,画面会显得更加光滑,所以我们称之为信号放大,这里放大的意思就是更加细腻而准确,那信号缩小也就很好理解了。

放大是其中比较简单的一种,假设我们已经对采样信号重建完毕,直观上,由于信号已经重建了,并且是连续现在我们所需要做的就是以样本频率的几分之几来重采样,当然这个分数要小于1

然而,在缩小信号的时候,这种技术却不能适用,原始信号的频率对于采样频率来说过高了,以至于无法避免狗牙乱飞的现象。不过,我们可以使用sinc滤波器,基于采样信号来生成连续信号,之后按照所需时间的间隔进行重采样。换句话来说,就是使用sinc滤波器增加低通滤波器的带宽,从而消除更高频率分量,这有些类似于笔记本印象对频率的偏中取向,让高频率尽量降低,低频率尽量的高,看起来好像把信号给压缩了一样,很明显的弥补了笔记本音响的低高频废柴的问题(扯多了。。。。。)。为了将重采样频率降低到原始采样频率的一部分,需要对滤波器的带宽加倍,那么在数字图像的表现上,类似于先对其进行模糊操作,也就是压缩信号,然后以低分辨率进行重采样。

接下来我们就来简单讨论一下关于减少狗牙的各种算法,相信经常关注技术的DIYer很容易就能找到自己曾经了解过的东西。

2.4.3 抗锯齿浅谈

很明显,前面所有的东西都是为了这一小节来打基础的,估计大家又要辛苦一下来阅读了。

如果采样和滤波进行的不怎么样,那么多边形的边缘就会产生一些可以被我们观察到的失真。此外,在阴影边界,镜面高光和其他一些RGB快速变化现象也会导致类似问题,当然这和显示器没什么关系。

抗锯齿技术的算法有一个同性,他们只是对图形管线的输出的采样样本进行操作,而不需要关于绘制对象的信息,但同样,代价巨大。

PS:关于直线的抗锯齿反走样,这个目前有不少方法,比如将直线看成一个和背景融合的单像素宽的四边形:还有将直线看成一个带有光晕,无限制的同名物体,甚至有时会将直线堪称反走样纹理来处理,将像素和屏幕网格分开来,前者包含有RGB信息,后者是屏幕上围绕像素位置的一个几何区域。如果对其有兴趣的话可以从谷歌上搜索一下学术论文,反正我是懒得说懒的看了,因为基本上全是代码。

抗锯齿技术有一个最一般的策略是,对图形进行采样,然后通过权重处理,并将所有样本相加,这样就可以得到像素颜色数据,非常简单,一个循环加法。

反走样抗锯齿过程中对每个像素进行多次采样的算法成为超采样方法,作为概念上最简单的一种实现方法,全景经反走样FSAA以较高分辨率对场景进行绘制,然后对相邻的采样样本进行平均,从而生成一幅新的图像。当然简单也意味着恐怖的运算量,由于必须对所有样本进行着色处理和填充,代价是相当可观的。

另一种相关方法是积累缓冲器。这种方法使用了一个缓冲器(顾名思义。。。。),与所期望图像的分辨率一样大,而不是离开屏幕的,其中颜色值的数量甚至会更多。为了得到场景的2x2大小的采样,通过在xy方向上移动半个像素,就可以生成四幅图像,每幅图像对应不同采样位置,在积累缓冲器里对这些图像相加。绘制之后,再对图像进行平均并显示。这个技术可以用于很多效果,比如动态模糊和精神,当然,它同样会增加额外的开销。

未完待续~~~~~




2.4.2  续接上文(这节死长。。。。)

       积累缓冲器不知道大家有没有吃透,下面我们继续介绍T缓冲器,Z缓冲器,它们相对于积累缓冲器来说无非是一种变化,其包括一组2幅或者更多的图像,他们均可以用来绘制图像,同时还需要一个掩区,用来决定三角形的传送位置。在管线的末端是一些简单的视频逻辑组件,可以将这组缓冲器结合起来,从而显示图像。因此,对于动态模糊和景深的实现来说,可以将三角形传送更多次,在改变位置或者是视觉的同时改变掩区,而无需这类效果的三角形可以向所有缓冲器只传送一次/

T缓冲器它强大之处就是可以用来抗锯齿,数据可以同时向所有缓冲器传送,对每个缓冲器可以分别处理设置屏幕上xy的偏移量(从某种意义上来说,这里的处理方法不能叫做real-time,有些游戏似乎也会采用类似前沿处理的方式进行优化,但是我还真没怎么见过)。因此,这里没有采用多个通路,而是简单的吧三角形传送一次,并在缓冲器中处理,其中每个缓冲器都有一个略微不同的视点偏移,将这些图像结合起来就可以得到抗锯齿图像。

相对于积累缓冲器来说,T缓冲器的优点是抗锯齿的任务可以由已有程序以默认的方式来完成,而不需要进行任何程序代码上的改动,。同样,因为只需要一个通路,只需将图形驱动设置为抗锯齿模式即可。

FSAA方法相比,积累缓冲器和T缓冲器有一个共同的优点,那就是在像素网格单元中,采样并不要求一定是均匀的直角形式。每个通路都相对于其他线路独立,所以可以同时具有其他的采样形式。

还有一种增加像素采样率的算法是A缓冲器方式,,这种算法通常用来生成高质量的图像。A缓冲器计算多边形在每个网格单元上的近似覆盖区域,而不是用较高分辨率绘制或者使用多通路。一般而言,多采样算法就是在单个通路中对每个像素多次采样,而且在同一个网格单元的样本见共享计算结果。在硬件A缓冲器存在的情况下,对于网格单元来说,每个表面的光照进计算一次,而且此结果由所有样本共享。这种较低光照采样频率有利于节省计算时间,但A缓冲器一般只适用于边缘抗锯齿和适度的透明绘制。

A缓冲器中,绘制的每个多边形都会为他全部覆盖或部分覆盖的屏幕网络单元生成一个掩区。多边形和覆盖掩区重叠的着色效果是以网络单元中心的着色效果计算的,深度值也是如此。有时候我们会计算出两个深度值,最大和最小值,其他一些系统也会保持多边形的亵渎,这样在任何子网个位置都可以获得准确的深度值z,从而允许绘制相互贯通的多边形,也就是彼此相互贯通的片段。覆盖掩区,着色效果,深度值和其他一些信息共同组成了这个片段。

屏幕网格单元可以由任意多的片段,当他们聚集在一起的时候,会求是被遮挡的片段。列入,如果透明片段A的覆盖掩区完全遮住了片段B,而且片段A的最大深度值比片段B的最小深度值药效,那么就可以直接丢弃B。覆盖掩区可以合并起来一起使用,例如,如果某个不透明片段这支了某个像素的一部分,同时另一个片段部分遮住了另外一个部分,那么它们的覆盖掩区就可以进行逻辑运算了,同时可以去其中最大的Z深度值作为合并后的z,这样就形成了一个更大的掩盖区域。由于这样的合并操作,所以我们需要对片段按照深度值进行排序。根据这种理念,在片段缓冲器充满或者是作为着色处理和现实前的最后一步,我们就要开始进行合并操作。

一旦所有多边形数据都送至A缓冲器,就可以自动计算出像素颜色,无非就是判断每个片段可见掩区的百分比,然后将片段颜色乘以该百分比,最后再把所有结果相加即可。它的优势在于,可以在此时将透明效果加进来而不是最后再重复处理。

如果你还不明白这种A缓冲器,那就请看下面这幅图。

1.JPG

怎么样,是不是有点眉目了?这是我第一次尝试画图,自己的winxp的画图工具都删掉了,只得来手工操作啦~~

这一小节还有一部分内容就得下次了。。。。。因为写了这些东西发现竟然过了一个多小时




不知道上一部分的多边形覆盖抗锯齿技术大家有没有看明白,,可能它是抗锯齿技术中比较难理解的一个了,所以我才画了张小图,不知道这样是否能够有更好的理解效果。这一小小节总算可以把抗锯齿说完了,还有很多其他的算法或者技术大家可以从谷歌啊百度啊等等搜索到,只要能把这篇图形学看懂了,网上的文章基本就是一些参考资料了,通俗易懂。



2.4.3 抗锯齿的终章

       不得不说一下NV的“quincunxHRAA技术,“quincunx”,如同他的意思一样是五个物体的排列方式,其中有四个在正方形的角上,第五个在正方形的中心,这玩意很想六边形上的污点团。再多发iyangkangjuchifangfazhongcaiyangmoshi是五点梅花桩式的,其中四个样本在像素单元的脚上,最后一个在中心,每个角上的样本值会分配给相邻的4个像素。与其他大多数方法不同,它给中心样本的权重是1/2,而其余四个角的权重是1/8.。权重我想很好理解,就是对像素值进行加法处理的时候到底取数据的百分之多少来相加,因为中心区域更能表现物体的色彩等等,权重自然要高,而其他大多数方法因为属于随机采样也便无需设置这类非对称的权重,这种抗锯齿技术不仅能获得很好的效果,而且因为采样点固定且数量较低性能占用较小。

既然上面说到了随机采样,那么下面也得介绍介绍咯,在每个像素处都是用不同的采样模式,这就是随机采样。之所以要提到,是因为在与随机性会用噪声来代替重复的走样效果,而我们人的视觉系统往往对这种噪声视而不见。

经常见到的一种采样方法是分层采样。我们先假设一个像素会用到n个样本,将该像素区域分成n个相等的区域,在每个细分区域中随即放置一个样本,最终的像素颜色可以由样本的某种平均方式得以计算。还有一种方法,七种n个样本放置在nXn网格中,每行每列都设置一个样本,这种方法比较适合获取接近垂直和水平方向的边缘信息。

再说说交叉采样。在ATI公司的方法中,抗锯齿硬件允许每个像素多达16个样本,也就是16X,而且在重复性模式中(比如说,在4X4大小的像素组中,每个像素可以有不同的模式)中允许混合多达16个用户自定义的采样模式。和随机采样类似,每个像素可以由不同的采样模式进行采样。然而几位ATI的工程师发现,在对每个像素应用相同的模式时,使用交叉采样可以减少其生成的走要现象。那么这种简单的采样重叠就无法行得通了,所以我们就在随机采样中加入一些限制,让这种重复性平坦,也就是说对多像素进行随机采样,而单像素上并不十分看重。

差不多就是这些了,一些典型的,具有代表性的抗锯齿技术,还想了解更多的就去搜索吧,比如最近的CFAA之类,充其量就是对像素进行评估,从而仅仅去采样那些边缘区域什么的。不多说,我们继续。





2.5 透明度,alpha

实时绘制中的透明效果相对来说比较简单而且具有相当的局限性,一般情况下不能实现的效果包括光线折射,由于透明物体的厚度而影响光线的逐步弱化,以及由于视角导致的光线反射和传输变化,也就是说,一定程度的透明度要比一点没有的好。

有一种叫做Screen Door透明度的简单方法,可以让物体呈现出透明效果,它的基本思想是勇气盼望个填充模式来绘制透明的多边形。也就是说,每隔一个像素来绘制一个多边形,这样会使在其后面的物体部分可见。不过这个技术有两个比较明显的限制。

首先,透明物体只有一半的透明度。虽然可以使用初期盘格式以外的填充模式,但是实际上很难在形状上辨别这些模式,这样就可能导致不稳定的透明,感觉就像隐身衣失效一样。

第二个就是在屏幕的一个区域中只能绘制一个这种透明物体。

当然不得不说这种方法十分简单,可以在任何时间,以任何顺序绘制透明物体,而不需要特殊的硬件支持。

这里就先稍微开个小头呗,下次介绍alpha混合,我相信关注技术层面的朋友一定想要知道,为什么目前主流的透明效果任务要放在最后进行处理,先买个小关子~~

在开始这篇文章之前,我们先讲一个笑话。我成功利用P2P终结者终结掉了某位同学。这让我心情十分舒畅,有一种飘飘欲仙的feeling。具体情况等我明天解密!
       图形学这篇文章我们已经有一段时间不讨论了,最近,我一直忙着“做菜”,要知道一道可口的美味是需要很多精力的。
       续接上文。Screen-Door透明技术已经在之前了解过了,现在我们再次重温一下它的特点。
       1 只能有50%透明度
       2 在屏幕的一个区域中只能绘制一个透明物体。
       3 消耗资源少,实现简单。
     对于更一般的,更灵活的透明效果来说,我们还需要能够将透明物体的颜色和其后面物体的颜色进行混合。为此,需要引入alpha混合技术。挡在屏幕上绘制某个物体的时候。与每个像素相关联的有一个RGB颜色值和一个Z缓冲器深度值。另外还有一个alpha值,这里的alpha值指的是给定像素处的透明程度,这个值就好像是颜色的权重(思考我们之前的反锯齿技术),如果alpha值是1,那么这个物体是不透明的。相反如果它的值是0,则这个物体不可见。
     为了使处于场景前方的物体透明,需要用小于1的alpha值对之进行绘制。由此物体覆盖的每个像素,都会从管线得到一个RGBa值。为了在场景中绘制透明物体,通常需要对物体进行排序。首先,绘制不透明的物体,然后在不透明物体的上方,对透明物体按照由后到前的顺序进行混合处理。如果按照任意顺序进行混合,那么就会产生严重的失真现象,这和混合方程有关系(这是选读部分,会在PS中指出)。如果两个透明表面相互叠加且各自的alpha值都是0.5,那么乱序就不会影响最终结果。如果根本不可能进行排序或者仅仅只能进行部分排序,那么最好用Z缓冲器而不是z深度值来绘制透明物体。这样,所有透明物体就都会显现。虽然其他一些技术可行,但是没有排序,那么适用性,广泛性就会差很多了。
     选读1:我们通常使用over操作来进行混合,它的方程如下

Co=As*Cs+(1-As)Cd
      下面是解读时间,Cs表示透明物体的颜色,As表示物体的alpha值,Cd表示混合前的像素颜色,Ca表示通过把透明物体放置在场景上得到的最终颜色结果。在将Cs和As传送给管线的情况下,像素的初始颜色Cd由最初颜色Co代替。通过对这个over操作的了解,我们知道,因为在计算透明物体的颜色值时需要考虑场景环境(因为透明是渐进的),所以必须将透明物体附近的环境进行绘制才可以进行透明。如果仅仅是单纯的透明操作,因为没有考虑到四周的环境问题,透明就会显得不自然,从而影响最终效果。其实这里就出现了CPU中的问题,任务之间具有相关性,所以不能简单的并行处理,而需要一定的排序。在DX11中引入了QIT技术来解决透明问题,实际上就是使用一部分晶体管来计算透明排序而不需要程序员的加入(应该是。。。。。个人猜想),就如同CPU中的调度器。

如果不使用排序,那么over操作就可以简化为如下形式:

Co=As*Cs+Cd

      由于透明物体的alpha值不影响最终结果,因此绘制顺序可以是任意的。

选读2:

其实我们还有其他方法,可以不需要进行排序。前面介绍的A缓冲器多采样方法就有一个优势,可以通过硬件排序来对片段进行组合,最终货到截稿质量的透明度。片段的alpha值一般表示透明度,或者像素单元的覆盖区,或者两者兼有。多采样片段的alpha值仅仅表示样本的透明度,因为它存储了不同的覆盖掩区。

      通过使用两个或者多个深度值缓冲区,以及多个数据通路就可以计算出透明度。首先要创建绘制管道,以便不透明物体表面的的z深度值在第一个z缓冲器里,于是就可以绘制透明物体。在第二个绘制管线上,对深度值检测并修正,一边接受一个物体平面,这个物体平面即靠近存储z深度值的第一个缓冲器深度值,而且是所有物体表面最远的一个。这样,将最靠后的透明物体绘制到帧缓冲器中,而将z深度值存储到第二个z缓冲期中,然后使用该z缓冲器在下一个通道中得到第二个最近透明表面,以此类推,由远及近,这样就可以得到透明效果了。

       当然,目前商业化的图形硬件还不具有两个专门的z缓冲器。但是可以利用类似方法,使用具有硬件支持的像素着色处理来比较z深度值,从而实现深度值切剥技术,但是这种方式因为需要过多绘制通路且需要像素着色单元,所以速度较慢。

除了over操作之外,还有很多其它融合操作,但是他们通常不会在即时渲染中使用。

下次我们说的是雾化,这个还算是简单,期待着吧!!!!

     

评分

参与人数 1人气 +1 收起 理由
Daigo + 1 码这么多字不容易,鼓励一下……

查看全部评分

caolizhen
 楼主| 发表于 2009-11-9 10:08:56 | 显示全部楼层
占楼备用
caolizhen
 楼主| 发表于 2009-11-9 10:09:17 | 显示全部楼层
占楼备用
caolizhen
 楼主| 发表于 2009-11-9 10:09:42 | 显示全部楼层
占楼备用
caolizhen
 楼主| 发表于 2009-11-9 10:10:07 | 显示全部楼层
占楼备用
Daigo
发表于 2009-11-9 12:40:03 | 显示全部楼层
乃太狠了……占这么多楼…偶都快后排了……
耍花剑的猫
发表于 2009-11-9 12:42:34 | 显示全部楼层
站位吧,等贴
Daigo
发表于 2009-11-9 12:47:45 | 显示全部楼层
期中考完试再细看吧……
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-24 11:47 , Processed in 0.136999 second(s), 20 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表