当前位置:   article > 正文

GAMES101笔记(一)

games101笔记

预备知识:线性代数、高等数学

 

目录

一、变换

1.矩阵变换

 2.视图变换

二、光栅化

1 屏幕像素的表示

2.光栅化算法

DDA数值微分算法

中点Bresenham算法

 三角形光栅化算法

3.抗锯齿

4.Z-Buffer算法

 三、着色

1.漫反射

2.高光

 3.着色方法

图形渲染管线


一、变换

1.矩阵变换

2D变换

缩放

拉伸

旋转

 变换都可写成矩阵形式

 

 对于2D有

2D_point=(x,y,1)^T

2D_vector=(x,y,0)^T

 对于3D有

3D_point=(x,y,z,1)^T

3D_vector=(x,y,z,0)^T

 3D齐次坐标表示

 2.视图变换

 将虚拟世界中以(x,y,z)为坐标的物体变换到 以一个个像素位置(x,y) 来表示的屏幕坐标系之中(2维)

模型变换:旋转,平移,缩放

摄像机变换:

相机或眼睛位置 (eye postion) e
观察方向 (gaze postion) g
视点正上方向 (view-up vector ) t

投影变换

正交投影:坐标的相对位置都不会改变,全部转换到一个\left [ -1,1 \right ]^{3}的空间之中


透视投影:透视投影就是最类似人眼所看东西的方式,遵循近大远小


 

 

 先压缩后正交投影,变换矩阵为:

最后将将这个被压缩过的空间,重新正交投影成标准小立方体,故定义透视投影变换:

 

补充:视图变换
模型变换(modeling tranformation):将一个物体自身进行变换(缩放、旋转、位移)
视角变换(view tranformation):根据眼睛来判断物体的相对位置
投影变换(projection tranformation):将三维空间内的物体投影至标准二维平面([-1,1]^2)之上
视口变换(viewport transformation):将处于标准平面映射到屏幕分辨率范围之内,即[-1,1]^2→\rightarrow→[0,width]*[0,height], 其中width和height指屏幕分辨率大小

 

 旋转变换:

 

视口变换:

 

games101 作业1

  1. Eigen::Matrix4f get_model_matrix(float rotation_angle)
  2. {
  3. Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
  4. // TODO: Implement this function
  5. // Create the model matrix for rotating the triangle around the Z axis.
  6. // Then return it.
  7. Eigen::Matrix4f tran;
  8. float angle = rotation_angle / 180.0 * MY_PI;
  9. tran << cos(angle), -1 * sin(angle), 0, 0,
  10. sin(angle), cos(angle), 0, 0,
  11. 0, 0, 1, 0,
  12. 0, 0, 0, 1;
  13. model = tran * model;
  14. return model;
  15. }
  16. Eigen::Matrix4f get_projection_matrix(float eye_fov, float aspect_ratio,
  17. float zNear, float zFar)
  18. {
  19. // Students will implement this function
  20. Eigen::Matrix4f projection = Eigen::Matrix4f::Identity();
  21. Eigen::Matrix4f per2orth;
  22. per2orth << zNear, 0, 0, 0,
  23. 0, zNear, 0, 0,
  24. 0, 0, zNear + zFar, -zNear * zFar,
  25. 0, 0, 1, 0;
  26. float angle = eye_fov * MY_PI / 180.0;
  27. float t = zNear * tan(angle / 2.0);
  28. float b = -t;
  29. float r = t * aspect_ratio;
  30. float l = -r;
  31. Eigen::Matrix4f orth;
  32. orth << 2.0 / (r - l), 0, 0, 0,
  33. 0, 2.0 / (t - b), 0, 0,
  34. 0, 0, 2 / (zNear - zFar), 0,
  35. 0, 0, 0, 1;
  36. Eigen::Matrix4f trans;
  37. trans << 1, 0, 0, -(r + l) / 2.0,
  38. 0, 1, 0, -(t + b) / 2.0,
  39. 0, 0, 1, -(zNear + zFar) / 2.0,
  40. 0, 0, 0, 1;
  41. projection = projection * orth * trans * per2orth;
  42. // TODO: Implement this function
  43. // Create the projection matrix for the given parameters.
  44. // Then return it.
  45. return projection;
  46. }

二、光栅化

光栅化的目的就是将想要展现的物体给真正现实到屏幕上的过程

1 屏幕像素的表示

 屏幕中的每一个像素点我们都用整数坐标进行表示,最大最小值与分辨率相对应,考虑到每个像素都有一定的面积,我们定义(x+0.5,y+0.5)为该(x,y)像素的中心,如图中黑圈所示。

像素:

1)是一个一个的小的方块.

2)每个方块内的颜色是完全一致的,像素就是最小的单位了,像素内部不会再发生变化。

3)我们用256个等级0-255来表示灰度(如等级0表示是黑的,等级255表示是白的),一个像素内的颜色可以用
rgb(red,green,blue)三个值来定义,用红绿蓝的各种组合来表示每一种红色蓝色绿色的密度,例如红色是(255,0,0),白色是(255,255,255)。

4)一个像素内颜色不会发生任何差异。

屏幕空间就是以屏幕左下角为原点建立一个二维坐标系

1)用(x,y)表示像素的位置。(蓝色像素表示为(2,1)坐标来表示)

2)如果一个屏幕分辨率为width * height,那么我们定义像素下标从(0,0)到(width - 1,height - 1),
且(x,y)像素的中心在(x + 0.5, y + 0.5),如蓝色像素的中心为(2.5,1.5)。

3)屏幕范围从(0,0)到(width,height)


现在我们要将一个中心在坐标原点,棱长为2的立方体显示在长为height、宽为width的屏幕中

 具体操作要进行一次视口变换,准确地说是通过缩放平移变换,

2.光栅化算法

光栅化就是考虑如何将图像呈现在光栅显示器中.般将图像拆分成许多不同的三角形

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/117250
推荐阅读