大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
光栅化
光栅化的任务
将在投影变换中得到的正则立方体显示在屏幕上
屏幕 screen
-
像素(pixels)的集合。
-
屏幕的大小使用分辨率(resolution)来刻画。
-
经典的光栅显示设备
像素 pixel
-
像素是一个具有统一颜色的小立方体
-
颜色由三部分组成red, green, blue
屏幕空间
屏幕被划分成一个个正方体,称为像素。像素使用坐标 ( x , y ) (x, y) (x,y)来表示,其中心是 ( x + 0.5 , y + 0.5 ) (x+0.5, y+0.5) (x+0.5,y+0.5), 范围是 ( 0 , 0 ) (0,0) (0,0)到 ( w i d t h − 1 , h e i g h t − 1 ) (width-1,height-1) (width−1,height−1)。
光栅化的步骤
光栅化主要分为两步
- 将正则立方体的 X , Y X,Y X,Y轴坐标变换到 [ 0 , w i d t h ] × [ 0 , h e i g h t ] [0,width]\times[0,height] [0,width]×[0,height]
- 将得到的图形画到屏幕像素上。
光栅化第一步 视口变换 viewport transformation
先缩放然后平移,变换过程中与z无关,变换矩阵如下所示。
( w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ) \begin{pmatrix} \frac{width}{2} & 0 & 0 & \frac{width}{2}\\ 0 & \frac{height}{2} & 0 & \frac{height}{2}\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{pmatrix} ⎝⎜⎜⎛2width00002height0000102width2height01⎠⎟⎟⎞
光栅化第二步 光栅化三角形到像素
这里关心的问题是如何将连续的三角形平面放到不连续的像素中显示。
最简单的光栅化方法:通过采样来解决,将像素中心在三角形内部的像素采样出来,然后用这些采样出来的像素点来代表三角形。
这里,判断点 P P P在三角形内部的方法使用了叉积,首先规定规定一个走向,如 A A A-> B B B-> C C C,然后按走向来依次计算3个叉积,如下所示
a ⃗ = A P ⃗ × A B ⃗ b ⃗ = B P ⃗ × B C ⃗ c ⃗ = C P ⃗ × C A ⃗ \vec{a}=\vec{AP}\times\vec{AB}\\ \vec{b}=\vec{BP}\times\vec{BC}\\ \vec{c}=\vec{CP}\times\vec{CA} a=AP×ABb=BP×BCc=CP×CA
若 P P P在三角形内部,则 a ⃗ , b ⃗ , c ⃗ \vec{a},\vec{b},\vec{c} a,b,c的方向相同。
但是采样会带来新的问题——走样 aliasing,这些问题都被称为sampling artifacts,例如
-
锯齿(jaggies),空间采样不充分导致的。
-
摩尔纹(moire),图像采样不充分导致的。
-
wagon wheel effect,时间采样不充分导致的。
解决上述问题的方法——反走样,其基本思路是在采样之前进行模糊化处理(pre-filter),然后再采样。模糊化处理实际上是在采样之前使用低通滤波器过滤掉高频部分,目的是使边缘模糊化。
实际的做法是使用超采样(supersampling MSAA),其基本思路是将一个像素再划分为多个小的部分来采样,然后每个像素的值是像素中所有的小的部分的平均值。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179394.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...