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

[图形学]SoftwareRender 三部曲3 —— 着色器(shader)

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

一.前言

在传统的固定渲染管线中,渲染中的一系列操作如:坐标转换、光照、投影、剪裁、扫描转换、纹理贴图、可见性测试、帧缓冲像一个流水线一样按部就班的按序执行。每一道工序上都有一些不同的参数,开发者为了完成不一样的效果就是去改变每个工序的参数。

然而人们总是不满足于这样有限的控制;于是就出现了后面的可编程渲染管线,将渲染中的一些工序交给shader来完成。你可以把shader看作是一段小程序,只不过是用作渲染中的一些操作。

所以在可编程渲染管线中,能够更自由的去通过编程得到想要的效果。shader的种类有很多,担任者不同的作用。不过在这里我们只用了解顶点着色器(Vertex Shader)和片元着色器(Fragement Shader)。

具体想更多了解固定管线和可编程渲染管线的区别可以看下知乎的这个问答

 

二.顶点着色器(Vertex Shader)

一般来说,顶点着色器需要做的事情,就是将模型的顶点坐标从物体空间转换到裁剪空间下,还有就是传输其他shader所需要的顶点数据。当然,如果想在片元着色器做光照模型可能需要顶点的法线;一般来说,我们都是在世界坐标系中做光照计算,所以有的时候我们也可以通过顶点着色器计算一些我们后面Shader所需要的数据。

 

三.片元着色器(Fragment Shader)

片元着色器一般是光栅化后,通过前面Shader计算或者是外部传入的一些数据计算来得到一个像素”最终”的颜色,其实这里的颜色并不一定是最终显示在屏幕的颜色,因为还会经过深度测试、模板测试、混合。

 

四.代码

根据以上的描述我们可以简单的建立一个Shader的基类,来描述一个Shader的基本操作:

在上面的代码中,VS,FS分别表示顶点着色器和片元着色器,其余的方法是用来设置Shader的一些参数。值得注意的是VS函数的参数和返回值,参数我们在上一节见过,是顶点属性结构体,用来表示一个顶点的属性;而返回值VertexOut则为顶点着色器的输出数据,用于后面Shader的使用,我们把VertexOut定义如下:

我们给VertexOut添加了一个Lerp方法,是用来在后面光栅化的时候插值使用。

本节相关代码:Mesh.hBaseShader.h


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

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

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