Character1

有一段时间没写文章了,这段时间一直在学习shader和工作,好了,不多说了,来记录下自己的学习过程。
先从最简单的例子看起:

Shader "Unity Sahders/TestOne"{
    SubShader{
        Pass{
            CGPROGRAM
            
            #progrma vertex vert
            #progrma fragment frag
            
            float4 vert(float4 v:POSITION):SV_POSITION{
                return mul(UNITY_MARTIX_MVP,v);
            }
            
            fixed4 frag():SV_Target{
                return fixed4(1.0,1.0,1.0,1.0);
            }
            ENGCG
        }
    }
}

这是一个很简单的Shadr程序,那么问题来了,一开始肯定会有很多疑问:
  第一行Shader "Unity Sahders/TestOne"通过Shader语义定义了这个Unity Shader的名字,你可以在选择shader时通过Editor面板快速找到
  第二行SubShader,一个unity文件可以包含多个SubShader语义块,但最少要有一个。当unity加载这个shader时,unity会扫描到所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支持的话,unity就会使用Fallback语义指定的SubShader。
  第三行Pass,SubShader中定义了一系列Pass以及可选的状态([RenderSetup])和标签([Tags])设置。每个Pass定义了一次完整的渲染流程,但如果Pass的数目过多,往往会造成渲染性能的下降。因此我们应当尽量试用最小数目的Pass。状态和标签同样可以在SubShader中声明。不同的是,SubShader中的一些标签是特定的,也就是说这些标签设置和Pass中使用的标签设置是不一样的,而对于状态设置来说,其使用的语法是相同的。但是如果我们在SubSahder中进行了这些设置,那么将会用于所有的Pass。
  第四行CGPROGRAM,首先,unity使用的是Nvdia的CG语言但是和其还是有些不同(先不关注),准确的来说是CG/HLSL,当然这里的CG/HLSL是unity经过封装后提供的,有些标准的CG/HLSL原生用法和函数unity并没有提供(笑2333)。表面着色器、定点和片元着色器代码就定义在CGPROGRAM和ENGCG之间。当然需要注意的是表面着色器是直接写在SubShader下的。
  还有需要注意的是,如果没有进行渲染设置和标签设置,SubShader将使用默认的渲染设置和标签设置
  第五、第六行#progrma vertex vert和#progrma fragment frag,定义了顶点着色器的函数名为vert,片元着色器的函数名为frag,当然,名字可以取其他的,这么写比较直观而且符合常规。
  第七、第八行是关于vert的具体内容,它是逐顶点执行的。vert函数的输入v包含了顶点的位置,这是通过POSITION语义指定的。它的返回值是一个float4的变量,它是该顶点在裁剪空间中的位置,POSITION和SV_POSITION都是CG/HLSL的语义,它们是不可忽略的,这些语义告诉系统用户需要输入哪些值,以及输出是什么。例如这里,POSITION将告诉unity,把模型的顶点坐标填充到输入参数v中,SV_POSITION将告诉unity,顶点着色器的输出是裁减空间中的顶点坐标。如果没有这些语义,渲染器就不知道该如果进行输入输出,return mul(UNITY_MARTIX_MVP,v);这一句就是把顶点坐标从模型空间转换到裁剪空间。对于图形学中的数学知识如果知道的话就很明白,这个单词也很直白,MARTIX意为矩阵,MVP意为Mode、View、Projection,指模型变换、视图变换、投影变换,关于这些数学知识可以查阅相关资料。
  对于片元着色器的代码,frag没有输入。它的输出是一个fixed4的变量,并使用了SV_Target语义进行限定。SV_Target也是HLSL的系统语义,它意为告诉渲染器把用户的输出颜色存储到一个渲染目标(render target)中,这里将输出到默认的帧缓存中。结果是返回了一个表示白色的fixed4类型的变量,片元着色器输出的颜色每个分量范围在[0,1],其中[0,0,0]表示黑色,[1,1,1]表示白色。
  额外补充的是SV_开头的语义是System Value Semantics,即系统值语义,所以学好英文多方便理解==

你可能感兴趣的:(Character1)