Something About Rendering Pineline(渲染管道)

本文深入探讨3D图形渲染的基础知识,包括矢量运算、矩阵变换、光照模型等内容,并介绍纹理映射、可见性判断及空间分割技术,旨在帮助读者理解3D图形渲染的关键步骤。

Math

Left-handed system(LHS)
这里写图片描述
这里写图片描述

Vector

Scalar Multiplication
这里写图片描述

Addition
这里写图片描述

Subtraction
这里写图片描述

Dot Product(点积)
这里写图片描述
u.v = ux*vx + uy*vy
u.v = |u| * |v| * cos(θ)
Fact 1: If the angle between u and v is 90 (perpendicular), then u.v = 0.
Fact 2: If the angle between u and v is < 90 (acute), then u.v > 0.
Fact 3: If the angle between u and v is > 90 (obtuse), then u.v < 0.
Fact 4: If u and v are equal, then u.v = |u|2 = |v|2.

Cross Product(叉积)
这里写图片描述
u x v = |u||v|*sin(θ) n
n = < uy*vz-vy*uz, -ux*vz+vx*uz, ux*vy-vx*uy >
n is the normal vector to both u and v

矩阵3D旋转
左手坐标系 旋转方向
这里写图片描述

这里写图片描述

1000cos(θ)sin(θ)0sin(θ)cos(θ)(xrotate)

这里写图片描述

cos(θ)0sin(θ)010sin(θ)0cos(θ)(yrotate)

这里写图片描述

cos(θ)sin(θ)0sin(θ)cos(θ)0001(zrotate)

The Viewing Pipeline and Multiple Render Paths

这里写图片描述

Local To World & World To Camera : 都类似于坐标平移操纵,to camera要考虑角度变换

Object Removal : 将object视作球体,找出距离最大的顶点作为半径。与viewing frustrum边界进行判断,若object在外部则可删除

Back-Face Removal : 计算多边形的Normal Vector(法向量) n, 与视线向量v 进行dot product(点积)运算

1. u.v = 0, u和v 夹角为 90度(remove)
2. u.v > 0, 夹角小于90度(visible)
3. u.v < 0, 夹角大于90度(remove)

Persepective Transform : 运用相似三角形定理
yp/d = y0/z0 -> yp = d*y0/z0
这里写图片描述

BMP File Formate

  1. 位图文件头(bitmap-file header)
    包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段

  2. 位图信息头(bitmap-information header)
    包含了位图信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数

  3. 彩色表/调色板(color table)
    彩色表/调色板(color table)是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像 的数据是指向调色板的索引。
    可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设有一256色的BMP图像的调色板数据为:

    调色板[0]=黑调色板[1]=白调色板[2]=红调色板[3]=蓝…调色板[255]=黄

    图像数据01 00 02 FF表示调用调色板[1]、调色板[0]、调色板[2]和调色板[255]中的数据来显示图像颜色。
    在早期的计算机中,显卡相对比较落后,不一定能保证显示所有颜色,所以在调色板中的颜色数据应尽可能将图像中主要的颜色按顺序排列在前面,位图信息 头的biClrImportant字段指出了有多少种颜色是重要的。
    每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值。

  4. 位图数据(bitmap-data)
    如果图像是单色、16色和256色,则紧跟着调色板的是位图数据,位图数据是指向调色板的索引序号。
    如果位图是16位、24位和32位色,则图像文件中不保留调色板,即不存在调色板,图像的颜色直接在位图数据中给出。
    16位图像使用2字节保存颜色值,常见有两种格式:5位红5位绿5位蓝和5位红6位绿5位蓝,即555格式和565格式。555格式只使用了15 位,最后一位保留,设为0。
    24位图像使用3字节保存颜色值,每一个字节代表一种颜色,按红、绿、蓝排列。
    32位图像使用4字节保存颜色值,每一个字节代表一种颜色,除了原来的红、绿、蓝,还有Alpha通道,即透明色。
    如果图像带有调色板,则位图数据可以根据需要选择压缩与不压缩,如果选择压缩,则根据BMP图像是16色或256色,采用RLE4或RLE8压缩算 法压缩。
    RLE4是压缩16色图像数据的,RLE4采用表5-5所示方式压缩数据。

Affine Texture Mapping
这里写图片描述
x,y和1/z呈线性关系在,投影平面上通过x’和y’对1/z线性插值,计算出1/z后,再计算出原始的x和y,然后在3D空间中通过x和y计算出u和v(x、y和u、v都是在3D空间中的三角形上定义的,是线性关系)。这样就找到了投影面上一个点所对应的纹理坐标的正确值


Clipping in 3D

这里写图片描述
问题: polygon顶点z<0 会造成透视变换翻转,z=0时会有除法运算错误(x/0),所以要对z<near clipping plane z 的顶点进行剪裁。
左右剪裁面在光栅化过程中被剪裁,此处不作处理。

这里写图片描述
1. (easy case)只有一个顶点在可视范围内
与光栅化线性插值计算类似,计算出两边与near clipping plane的交点,组成新的多边形。
2. (hard case)两个顶点在可视范围内
同上,计算出2个交点。此时得到四边形,将其分为两个三角形,重新计算各自uv,最后插入渲染列表


Types of Lights

Directional Lights
距离无限远,没有方向
light intensity = light initial intensity * light color
这里写图片描述

Point Lights
Point lights are modeled as single points in 3D space, thus they have fallof based on distance from the surface.
kc : a constant attenuation(衰减) factor
kl : a linear attenuation factor
kq : a quadratic attenuation factor
d : the distance from the light source to point on the surface
这里写图片描述

Spotlights

这里写图片描述

Depth Buffering and Visibility

这里写图片描述
光栅化阶段,将每个将要绘制的像素点与相同坐标之前已绘制的点进行z比较,z值较小的点可已绘制并保存信息

这里写图片描述
Hybird Z Buffering : 设定一定z范围内的polygon使用z-buffer, 其他z部分使用普通的z排序


Transparecy and Alpha Blending

p_final = (alpha)(p_source1) + (1-alpha)(p_source2)
问题 : 透明polygonA 比 polygonB 距离观察者更近,polygonB不能通过z-buffer检测而无法被渲染。
在经过普通z-order排序后,再使用z-buffer光栅化。
初始化color-buffer,颜色填充为背景色,如果当前color的alpha介于0~255之间,进行alpha blending运算,并更新color-buffer。
光栅化过程:

POINT4D p0; //caculate
if(!testPointInScreen(point)) continue; //屏幕范围内
float z;    //caculate
if (!testZBuffer(tmpZ, &p0)) continue;  //z-buffer test
RGBAV1 color;   //将绘制的颜色,包含了alpha
blendWithZBufferColor(&p0, &color); //与color-buffer进行alpha blending运算
writeToZBufferColor(&p0, &color); //更新color-buffer
drawPoint(&p0, &color); //绘制

Linear Piecewise(分段) Perspective Mapping

与完全精准的透视映射不同,将映射精确到可以接受的范围内,
每隔一定间距(16-32像素),精确计算uv,然后再进行线性映射。
物体距离视距越近,采样点越多,越精确,反之更加趋近于线性映射。

Method I : 每n行, 每行隔n像素取点
Method II: 每一行间隔n像素取点
Method III: 每行两端取点,线性插值


Bilinear Texture Filtering(双线性过滤)

当前计算得到uv,忽略了小数部分,会丢失精度, 本来可用来绘制质量更高图像的信息被丢弃。
双线性插值 不丢弃小数部分,而是根据纹理坐标uv采集纹理图中相应点周围的像素。
例如 u,v (2.1, 3.2) -> (2, 3)
双线性插值
p_final = (0.75*0.75)*p0 + 0.1875*p1 + 0.1875*p3 + 0.0625*p2

int ui = (int)u;
int vi = (int)v;
float du = u - ui;
float dv = v - vi;
float pfinal = (1-du)*(1-dv)*texture[u][v] + 
               (du)*(1-dv)*texture[u+1][v] +
               (du)*(dv)*texture[u+1][v+1] + 
               (1-du)*(dv)*texture[u][v+1];

Spatial Partioning

当前阶段为了删除不需要渲染的多边形,进行了如下工作:

  1. 将物体视作球体,判断是否在可视范围内
  2. 通过向量运算,将朝向背面的多边形移除
  3. 对超过视景体的多边形进行剪裁

problems :

  1. 如何对空间/物体进行划分,以便能够快速地将大部分场景剔除掉,以帮助渲染和可见性判断?
  2. 有办法在游戏中根据任何给定的视点确定哪些多边形可能是可见的,进而只对这些多边形进行处理吗?

Binary Space Partition
Axis-Aligned Binary Space Partitioning
这里写图片描述
使用平行于坐标轴的分割面进行空间划分

Polygon-Aligned Space Partioning
这里写图片描述
如果分割面与多边形相交, 则根据交点将其分割成两个多边形

  1. 选择一个多边形,将其作为分割面
  2. 创建两个子列表, 分别包含位于分割面前面后面的多边形, 然后将分割平面对应的BSP节点的front和back指针指向它们.
    这里写图片描述
    可能会出现如图所示情况,则需要把多边形分割为两部分,分别插入前后列表
  3. 递归处理front列表
  4. 递归处理back列表
    这里写图片描述

Limitations of the BSP
1. 不能用于包含大量移动物体的场景,这种情况下每帧都需要重新生成BSP树
2. 场景必须是办静态的,不能旋转,有些情况下可以平移

Zero Overdraw Strategies Using BSP Trees
Problems : 使用z排序 或者 z-buffering算法会造成 同一个像素点多次绘制,并且总是会有z-buffering测试。
Method : 光栅化阶段, 每一条 扫描线记录下 起始点,终点x坐标(x_start, x_end),以y为index存储。最后得到如下情况:
这里写图片描述
1. 直接光栅化
2. 直接光栅化
3. 有一条被完全覆盖,则将其丢弃,避免重绘
4. 部分遮掩,合并后在光栅化,避免重绘

Potentially Visible Sets
PVS : 给定任何视点,都可以有一个从该视点可能能够看到的多边形列表;以视点作为索引找到pvs(潜在可见集)
这里写图片描述
这里写图片描述

//adjacency matrix
    i1  i2  i3  i4  i5  i6
j1  1   1   1   0   1   0
j2  1   1   1   1   1   0
j3  1   1   1   1   1   1
j4  0   1   1   1   0   1
j5  1   1   1   0   1   0
j6  0   0   1   1   0   1

这里写图片描述
1. 确定视点所在的房间,并保存这种信息
2. 使用任何技术(BSP,z-buffering, z-order 等)渲染当前房间中的多边形
3. 对于当前房价的每个portal, 只渲染通过入口(portal)可以看到的多边形

Bounding Hierarchical Volumes
这里写图片描述
创建包围体层次结构,可以用来进行大规模的碰撞检测或剔除

这里写图片描述
最上一层,只有一个球体,包含了整个游戏世界。
如果整个根节点都被剔除,则将整个子节点都标记为被剔除
在每个节点处,可以以深度/广度优先的方式递归处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值