从零开始写光栅化渲染器4:三维物体的呈现

###1.三维物体的呈现过程

这里写图片描述
这里主要详细介绍投影转换及屏幕映射。

2.投影转换

当模型转换到相机空间时,便要对顶点进行裁剪处理,剔除那些不在视锥体之内的顶点。
视锥体的空间如下,包含一个近裁剪面和一个远裁剪面,以及一个视角角度Fov,视角屏幕的宽高比Aspect。
这里写图片描述
投影转换矩阵如下:
[ C o t ( f o v / 2 ) / A s p e c t 0 0 0 0 C o t ( f o v / 2 ) 0 0 0 0 ( F a r + N e a r ) / ( F a r − N e a r ) 1 0 0 − 2 N e a r ∗ F a r / ( F a r − N e a r ) 0 ] \begin{bmatrix} Cot(fov/2)/Aspect&0&0&0\\ 0&Cot(fov/2)&0&0\\ 0&0&(Far+Near)/(Far-Near)&1\\ 0&0&-2Near*Far/(Far-Near)&0\end{bmatrix} Cot(fov/2)/Aspect0000Cot(fov/2)0000(Far+Near)/(FarNear)2NearFar/(FarNear)0010

投影转换矩阵主要是将x,y,z三个坐标规约化到[-w,w]之内,结合透视除法,将坐标转换到裁剪空间。
在这里插入图片描述
具体推到如下:

Y:对于坐标的y轴, t a n ( f o v / 2 ) = y / w tan(fov/2)=y/w tan(fov/2)=y/w,这里w=z;所以 − w ≤ y / t a n ( f o v / 2 ) ≤ w -w≤y/tan(fov/2)≤w wy/tan(fov/2)w,令m21=cot(fov/2)即可。
X:根据宽高比,可以得到m11=cot(fov/2)/Aspect。
Z:对于z,可以联立方程求解

N e a r ∗ m 33 + m 43 = − N e a r Near*m33+m43=-Near Nearm33+m43=Near
F a r ∗ m 33 + m 43 = F a r Far*m33+m43=Far Farm33+m43=Far

W:w用于记录z值,用作透视除法及后续纹理插值。
bool is_out_of_range(Vector3 v)
{
	int check = 0;
	if (v.z < -1.0f) check |= 1;
	if (v.z >  1.0f) check |= 2;
	if (v.x < -1.0f) check |= 4;
	if (v.x >  1.0f) check |= 8;
	if (v.y < -1.0f) check |= 16;
	if (v.y >  1.0f) check |= 32;
	return check>0;
}

完成透视除法后,根据如上算法,剔除不在视锥体内的节点。

3.屏幕映射

屏幕映射主要是将裁剪空间内的坐标映射成屏幕坐标,以显示到屏幕上。
[ w i d t h / 2 0 0 0 0 − h e i g h t / 2 0 0 0 0 1 0 w i d t h / 2 h e i g h t / 2 0 1 ] \begin{bmatrix} width/2&0&0&0\\ 0&-height/2&0&0\\ 0&0&1&0\\ width/2&height/2&0&1\end{bmatrix} width/200width/20height/20height/200100001
由于windows中Y轴倒置,所以m22为负。

4.正方体

这里写图片描述
项目完整地址:

3DRender: https://github.com/zhanghuanzj/3DRender.git

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值