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

  • 相关阅读:
    python笔记2-python常见数据类型(一)
    python笔记1-环境安装和基本语法
    selenium自动化脚本错误总结
    Postman-Post请求示例
    用PHP删除ftp下载导致的文件空行
    JS实现鼠标悬浮,显示内容
    asp.net中处理程序调用HttpContext.Current.Session获取值出错
    自动化创建tornado项目
    fabric运维
    Python3虚拟环境安装:virtualenv、virtualenvwralpper
  • 原文地址:https://www.cnblogs.com/WongSiuming/p/7479735.html
Copyright © 2011-2022 走看看