Shader学习之旅:入门介绍

来源:互联网 发布:北平无战事曾可达 知乎 编辑:程序博客网 时间:2024/06/06 13:05

最近想开始学Shader编程了,教材是Shaders For Game Programmers And Artists

先来一点前置介绍,嘛,也就是学游戏编程啥的一定要学的东西。

注:用的是Directx9,我才不会说我的渣机带不起Directx11。


一、 变换

又是变换,看了不少教材基本上每一本都要讲变换都讲到吐,这里还是提一下:

1. 平移变换

所谓平移变换就是把一个点发生一个位移移到另一个点的过程。由于使用三元向量是无法通过矩阵乘法来达到平移的效果的,因此在图形学中使用四元齐次向量来表示(x,y,z,w,如果是表示点,则w为1,如果是向量则为0),此时的变换矩阵如下:

                  R=[1,  0,  0,  0
                        0,  1,  0,  0
                        0,  0,  1,  0
                        Tx, Ty, Tz,1]

可以验证一下:如果是点(0, 1, 2)想要通过一个平移变换(1, 2, 3),那么操作如下:

                       [1,  0,  0,  0
[0, 1, 2, 1]       0,  1,  0,  0      = [1, 3, 5, 1]    验证成功
                        0,  0,  1,  0
                        1,  2,  3,  1]


2. 缩放变换

所谓缩放变换顾名思义就是在x,y,z轴上进行缩放,矩阵很简单如下:

                  R=[Sx,  0,  0,  0
                        0,  Sy,  0,  0
                        0,  0,  Sz,  0
                        0,   0,   0,  1]

不解释……



3. 旋转变换

所谓旋转变换就是绕着某个轴进行旋转,首先放出对x, y, z的旋转矩阵:

    X: R=[1,  0,  0,  0                   Y:   R=[cosθ,  0,  sinθ,  0           Z:格式与x类似
               0,  cosθ,  -sinθ,  0                 0,  1,  0,  0                            把1移到z的位置即可
               0,  sinθ,  cosθ,  0                  -sinθ,  0,  cosθ,  0                        
               0,   0,   0,  1]                            0,   0,   0,  1]                             


有必要提一下绕任意轴A旋转的矩阵,就不手打了,从3D数学上面截图:


其中c为cosθ, s为sinθ. 证明就不证明了,够累人的。



二、渲染流程

这本书里面前两章吹水的章节里面我觉得这个算比较重要的东西了。先截图如下:


从图中可以看出在directx 9 中把渲染流程氛围三个大块,分别是:

1. Source Operation,翻译过来应该就是啥来着?我不清楚。反正这里处理的大概是输入的顶点啊,曲面的细分啊之类的用户输入的东西。


2. Vertex Operation,顶点操作,也就是针对用户输入的顶点,通过固定流水线或者可顶点着色器来进行计算,不过现在固定流水线基本上已经被抛弃了。这个步骤主要针对的是顶点,实现的是裁剪啊确定视锥体啊投影啊什么的。


3. Pixel Operations,像素操作,这里也就涉及到对于像素的操作了,比如说对于面里面的像素的差值啊光栅化啊每个像素的深度缓存或者模版缓存啊透明度啊什么的。这个操作处理完了之后也就完成了渲染,剩下的就是渲染了。


那么接下来换本书,来讨论讨论像素着色器的东东。用的是Mathematics for 3D Game Programming and Computer Graphics,经典教材中的第一章里面的7~8页。



这个是一个图元被光栅化所需要经过的步骤,第一步是面选取,也就是说选取那些你能看到的,另外一些不能看到的就不会处理比如背面消隐就是一个粒子。但这个通常是作为优化选项而存在。


然后就是进行光栅化了,光栅化实际上就是把这些面填满像素……不解释。


然后就进行着色了,着色也就是通过无论什么都行,反正只要把每个像素的颜色决定出来就可以。


在进行完这些之后,也就进行了Fragment Operation,在此继续细分:


这幅图展示的是一个Fragment在被写入背面缓存的时候要经过的操作:


首先是Pixel Ownership Test,这个是惟一一个绝对不能跳过的步骤,它表示一个fragment需要判断是否在视口里面,是否需要画出来。


然后是Scissor Test,意思大概就是裁剪测试,它意味着检测这个店是否在当前窗口之外,如果在窗口之外的话就不化了,属于优化可选项。


然后是Alpha Test, 意思大概就是透明度测试,这个就不解释了吧,自己也能想到。


然后是深度/模版测试,这个也不用解释了把……


最后就是Blending,算出最终的颜色,然后写入背面缓存。


这大概就是一个渲染的工作流程。


哎呀呀,发现自己真的是个三分钟热度的人啊,希望能够坚持下去吧。


0 0
原创粉丝点击