• 欢迎来到莫知我哀的博客,日常不定时更新C++、C#、Unity、OpenGL、游戏开发相关文章。同步博客: CSDN
  • 网站左下角可以开启好听的背景音乐~~
  • 如果您觉得本博客很有看点,那么赶紧使用Ctrl+D 收藏吧

[图形学]SoftwareRender 三部曲4 —— 流水线

图形学 wahh 306次浏览 0个评论 扫描二维码

一.前言

已经是三部曲中最后一个章节,这个章节结束之后将会完成这个SoftwareRender。而这章也是内容最多,最不容易理解的章节。

 

 

二.缓冲区

在写流水线之前我们要先实现缓冲区,因为流水线上的读写操作都是在缓冲区中实现的,一般来说缓冲区有颜色缓冲区、深度缓冲区、模板缓冲区。在这里为了简单,我们只实现模板缓冲区和深度缓冲区。对于缓冲区而言,我们就简单的提供三个接口:初始化、读、写。

 

 

三.流水线

你可以把流水线理解为从模型、贴图等等各种数据到最后像素颜色的过程。在这个系列中,我们只是实现一个简易的SoftwareRender。所以这里实现的也是简易的一个流水线。

  • 顶点着色器
    一开始,我们将输入的所有顶点数据传入至顶点着色器,利用顶点着色器的功能将顶点从物体坐标转化为投影坐标,同时也将顶点中的其他数据一起输出,供流水线后面的工作使用。

  • 组装图元
    我们按照图元的类别,按序将顶点组装成图元,在这个Software中,我们只提供了三角形这一类图元,那么其实在这里就只是按序将每三个顶点数据组成一个组。

  • 背面剔除(背面消隐,Face Culling)
    如果对背面这个概念不是很熟悉的朋友可以先看看wiki Back-face Culling
    当顶点着色器之后,所有顶点坐标都是在裁剪空间下,而且照相机(人眼)的位置为(0,0,0)。所以我们只需要用三个点组成的两个向量的叉乘的Z轴方向即可判断该三角形图元是背面还是正面。

  • 裁剪
    很显然,对于三个顶点都在视野外的图元,我们是没必要去光栅化的,那么如何判断顶点坐标是否在视野外呢?我们知道在透视投影中,我们做了两个事情,一是将3维空间的点投影到近投影面上,二是将点CVV化。不过,在透视投影阶段我们是没有做透视除法的。所以实际上在视野内的三个维度的范围应该是[-w,w],[-w,w],[0,w]。所以我们只需要判断点的坐标是不是在这个范围就知道顶点坐标是否在视野内。

  • 透视除法
    将齐次坐标转化为非齐次坐标,也是透视投影中最核心的一步,也正是因为透视除法使得给人以近大远小的感觉

  • 视口变换
    根据ViewPort视口,进行视口变换,利用视口的选取,我们很轻松就可以实现画中画的效果。

  • 光栅化三角形
    最复杂的一步就是光栅化了,我们光栅化一个三角形,是根据三角形的顶点位置分为平顶三角形,平底三角形和普通三角形。对于普通三角形可以通过分割的方式变为一个平底三角形和一个平顶三角形,剩下的就是做线性插值。

  • 深度检测
    深度检测是进行检测深度值得手段,也就是我们所说的前面的物体总是会’盖住’后面的物体,这里的前就是指深度值较小的,后面的物体是指深度值较大的。我们在渲染的时候是没办法保证从’最近’或者’最远’的顶点开始画;所以我们需要提供深度检测这样的手段,保证当已经渲染的较近的像素时,就不必计算较远的。在运行片元着色器之前,我们可以提前进行深度检测,这样可以避免对深度检测失败的点进行片元着色器的开销。

  • 片元着色器
    光栅化最后,实际上是在两点之间进行插值填充,也是在这个时候,我们将插值得到的顶点数据传递给片元着色器,通过计算得到实际的像素颜色。

 

 

四.后言

本节完成之后,也表示这个SoftwareRender已经做完了。不过此时应该还看不到效果,因为现在只有一个渲染框架。我们还需要添加上层的逻辑代码才能使得渲染出东西,具体有兴趣大家可以去Github上看完整工程。

本节相关代码:Device.hDevice.cppDeviceContext.hDeviceContext.cpp


莫知我哀 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:[图形学]SoftwareRender 三部曲4 —— 流水线
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
Title - Artist
0:00