计算机图形学-光栅化

视角场与宽高比

tanfovY2=t|n|aspect=rt\begin{align} \tan \frac{fovY}{2} = \frac{t}{\lvert n \rvert} \\ aspect = \frac{r}{t} \end{align}

完成MVP变换后,就需要将模型画到屏幕上了。

屏幕

  • 一个二维的像素数组
  • 数组的大小:分辨率
  • 一种典型的光栅成像设备

光栅就是屏幕的德语,光栅化就是将物体显示在屏幕上。

  • 像素通过(x,y)的坐标形式表示,像素的中心在(x+0.5,y+0.5)
  • 如果我们认为屏幕的分辨率为width∗height,那么共有(0,0)~(width−1,height−1) 个像素
  • 屏幕空间覆盖了(0,0)到(width,height)的范围

视口变换

  • 与z轴无关
  • [1,1]2[0,width]×[0,height][-1,1]^{2}到[0, width]\times[0, height]

视口变换矩阵:

Mviewport=(width200width20height2height2000100001)M_{viewport} = \begin{pmatrix} \frac{width}{2} & 0 & 0 & \frac{width}{2} \\ 0 & \frac{height}{2} & \frac{height}{2} & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

采样

采样一个像素,判断它是否在模型的三角形内部。

首先需要明确采样点位置,一般选用像素中心作为采样点,坐标为(x + 0.5, y + 0.5)。

这里给出两种判断像素是否在三角形内部的方法:

叉乘法

首先按顺时针或者逆时针顺序给出三角形的三个顶点P0P1P2P_{0} P_{1} P_{2}的坐标,坐标只关心X、Y。这里以逆时针为正做演示。

(P2P1)×(QP1)>0(P_{2} – P_{1}) \times (Q – P_{1}) > 0时,在边P1P2P_{1}P_{2}左边。

(P2P1)×(QP1)=0(P_{2} – P_{1}) \times (Q – P_{1}) \equal 0时,在边P1P2P_{1}P_{2}边的延长线上。

(P2P1)×(QP1)<0(P_{2} – P_{1}) \times (Q – P_{1}) < 0时,在边P1P2P_{1}P_{2}边的右侧。

可知,当全部都在左侧也就是上面的三个式子都大于0的时候,点Q在三角形内部。当本方法只能判断内外,不能进行后续的插值运算(比如深度插值)。

重心坐标法

三角形内任意一点都可以被表示为三个顶点的线性组合。

P=αV0+βV1+γV2P = \alpha V_{0} + \beta V_{1} + \gamma V_{2}
α+β+γ=1\alpha + \beta + \gamma = 1

如果,α β γ\alpha \ \beta \ \gamma都大于等于0小于等于1,那么P在三角形内部。

计算重心坐标首先要计算三角形的面积。

S=12V0V1×V0V2S = \frac{1}{2} \vec{V_{0}V_{1}} \times \vec{V_{0}V_{2}}

系数等于对边三角形的面积/三角形的总面积。

α=SV1V2S\alpha = \frac{S_{V_{1}V_{2}}}{S}
β=SV0V2S\beta = \frac{S_{V_{0}V_{2}}}{S}
γ=SV0V1S\gamma = \frac{S_{V_{0}V_{1}}}{S}

性能优化-增量式计算

可知,对于每一个三角形,它的面积也就是上面式子的分母是不变的。而分子经过变换都能写成Ax+By+CAx+By+C的形式。而相邻像素的x与y是依次递增的关系。当x+1时,可在前一个像素的基础上加A。当y+1时加B。

透视校正插值

屏幕空间中的重心坐标不能直接用于纹理坐标、法线、颜色、世界坐标等属性的插值。而齐次除法(透视除法)是非线性变换,变化后的屏幕空间不能直接组合3D空间中的属性插值。应该先进行透视校正。

bcClip=(αw0, βw1, γw2)αw0+βw1+γw2bcClip = \frac{(\frac{\alpha}{w_{0}}, \ \frac{\beta}{w_{1}},\ \frac{\gamma}{w_{2}})}{\frac{\alpha}{w_{0}} + \frac{\beta}{w_{1}}+\frac{\gamma}{w_{2}}}

包围盒优化

实际上,我们不需要对屏幕上每个像素都判断它是否在三角形内部。我们可以确定三角形三个顶点的最小x、最大x、最小y、最大y,只对处于该包围盒的像素进行计算。

采样瑕疵

采样是对输入信号进行离散地取样。当信号变换过快而采样频率过慢时就会出现采样瑕疵。包括锯齿、摩尔纹等。

MSAA抗锯齿

首先,对每个像素增加采样点。对这些采样点做覆盖测试,判断它是否在三角形内部,并且要做深度测试。只有通过了深度测试的采样点才是有效的采样点。

片元着色器还是对像素中心点的位置进行着色。每个采样点都需要单独保留深度与颜色。通过采样测试的点的颜色就是这个像素通过深度插值得出来的颜色。而未通过测试的点不更新深度也不更新颜色。

最后所有物体渲染完成,将每个像素的采样点读取出来,对颜色取平均值就是该像素的颜色。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇