zoukankan      html  css  js  c++  java
  • [小明学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

  • 相关阅读:
    DB2数据常用指令
    HTMLParser使用
    面试知识点总结之数据库
    面试知识点总结之算法
    面试知识点总结之操作系统
    面试知识点总结之计算机网络
    面试知识点总结之Java语言
    一个精确匹配的问题
    【转】矩阵求导,矩阵计算
    【转】用C语言扩展Python的功能
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/7479735.html
Copyright © 2011-2022 走看看