TA小学生的Unity Shader(一)

  相信很多人开始学习Shader都是从“连连看”开始的,无论是Unity的Shader Forge还是Unreal的材质模块,所见即所得,喜闻乐见。
  深入探究一些以后,你会发现即时“连连看”也需要理论支持。废话不多说,现在开始,我们一起来做TA小学生,慢慢来学习怎么编写Shader。
 
  PS:本人对Shader这块的理解还颇为浅薄,只想抛砖引玉,大家一起来好好学习。有纰漏之处请大家及时指正。
 
  在开始码代码之前,我们先来看看图形硬件是如何工作的。
  以下引用“CG Tutorial”第一章的内容:
 
  A pipeline is a sequence of stages operating in parallel and in a fixed order. Each stage receives its input from the prior stage and sends its output to the subsequent stage. Like an assembly line where dozens of automobiles are manufactured at the same time, with each automobile at a different stage of the line, a conventional graphics hardware pipeline processes a multitude of vertices, geometric primitives, and fragments in a pipelined fashion. 
 
     Pipeline是一组并行的Stage,它们按照一定的顺序排列。每个Stage都从前一个Stage接受到输入,把它的输出传递到下一个Stage。就像汽车生产流水线处理汽车部件一样,常规的图形硬件的pipeline处理一堆点,图元,和fragment。
 
     配上这张流程图,看得更清楚,一步一步:
 
 
  不理解上面每一步在干嘛也没关系,现在只要清楚处理的过程是流水线。更方便的是,我们在Shader里面看到的是两个大处理步骤,处理vertex的代码,和处理fragment的代码,可以简单理解为顶点着色器和像素着色器。这样就可以写一个最简单的Unity Shader了:
 1 Shader "TAShaders/TAShader_001" {
 2     SubShader
 3     {
 4         Pass
 5         {
 6             CGPROGRAM
 7             
 8             //告诉图形硬件,我的vertex program是叫做vtx的函数
 9             #pragma vertex vtx
10             //告诉图形硬件,我的fragment program是叫做frag的函数
11             #pragma fragment frag
12             
13             //结构定义,把场景中的信息传递给vertex program
14             struct app2vtx
15             {
16                 float4 vertex    :     POSITION;    //把场景中的点的位置信息传递给vertex
17             };
18             //结构定义,把vertex program处理后的信息传递给fragment program
19             struct vtx2frag
20             {
21                 float4 pos      :     POSITION;    //把vertex program处理后的点的位置信息传递给pos
22                 float4 color    :     COLOR;    //把vertex program处理后的点的颜色信息传递给color
23             };
24             
25             //vertex program
26             vtx2frag vtx(app2vtx appIn)
27             {
28                 vtx2frag vtxOut;    //把点从本地坐标系切换到投影坐标系,不理解没关系,先用着
30                 vtxOut.pos = mul(UNITY_MATRIX_MVP, appIn.vertex);        
31                 vtxOut.color = float4(1,1,0,1);        //给模型的颜色为黄色
32                 return vtxOut; 
33             }
34             
35             //fragment program
36             float4 frag(vtx2frag vtxIn)    :    COLOR        //把最终的float4输出为颜色数据
37             {
38                 return vtxIn.color;
39             }
40             ENDCG
41         }
42     }
43 }

 

posted on 2016-06-01 14:13  yuyujohn  阅读(767)  评论(0)    收藏  举报

导航