[小明学Shader]光栅化渲染器

一.写在前面

  在学习图形学的过程中,在知乎上看到了几个前辈实现的渲染器,在参照《3D游戏编程大师技巧》以及几位前辈的代码下,用c#实现了一个版本的软件渲染器.

  实现代码量并不大,但事实上"不要被这微小的代码量所迷惑,量少就意味每一行代码每一个函数都潜藏着巨大的知识量",本博客意在梳理实现过程中所涉及到的知识点.

  若只对前辈们的实现感兴趣,我在本文的最后放了其它实现的github链接.

二.涉及内容

  1.渲染管线 

  程序采用的管线,剪枝裁剪,对屏幕外顶点进行了剪枝,也可以做多边形裁剪.

    

  2.数学运算

    ①向量点积与叉乘的算法与意义

    ②齐次坐标

      齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR   

      齐次坐标的理解

    ③矩阵乘法

  3. 3D变换

    ①透视变换步骤

    ②坐标系转换

    ②相机坐标到屏幕坐标转换

  4.纹理双线性过滤采样

    ①目的

      减少因映射造成的纹理信息丢失,减少颗粒感.

    ②方法

      对uv值所对应的纹理坐标分别向上向下取整,取得四个像素点的采样,分别取样对取样结果根据原始坐标所占比例进行插值.

    ③代价

      取样变慢.

    ④参考

      Direct3D 图形学习指南:双线性纹理筛选

  5.纹理透视偏差校正

    ①参考 

           潘宏:深入探索透视纹理映射(下)

    ②注意

      透视映射uv时,因为屏幕坐标x,y的变化是与1/z 成线性变化的,所以在计算扫描线前,划分三角形时,插值计算就要对uv/z进行插值,而不是uv.

  6.光照

    简单的方向光Lambert;

  7.裁剪

    ①背面剔除

      根据三角形法向量与相机eye方向的夹角,小于90度的裁掉.

    ②深度裁剪

    ③多边形裁剪

      根据转换后三角形在屏幕上的坐标进行裁剪.屏幕外的直接剔除

三.效果图

  1.纹理透视映射

   

  2.顶点色

  

  3.顶点光照

  

四.源码

  github.com

五.参考

  韦易笑:mini3d

  李雪峰:tinyEngine

posted @ 2017-09-05 17:29  WongSiuming  阅读(1101)  评论(0编辑  收藏  举报