Shader 入门精要笔记(5)

Unity Shader 的形式:

 Shader  "MyShader"

     Properties{

                  //真正意义上的 Shader 代码会出现在这里

                  //表面着色器(Surface Shader)或者

                  //顶点/片元着色器(Vertex/Fragment Shader)或者

                  //固定函数着色器(Fixed Function Shader)

                     }

                     SubShader{

                                        //和上一个SubShader类似

                                       }

                    }

表面着色器:Surface Shader 是Unity自己创造的一种着色器代码类型。它需要的代码量很少,渲染代价很大(Unity在背后做了很多工作)Unity提供了它,它在背后仍然把它转换成了相应的顶点/片元着色器。它自动提供了很多光照细节:

    Shader "Custom/Simple Surface Shader"{

                   SubShader{

                          Tags{ "RenderType" = "Opaque"}

                           CGPROGRAM

                            #pragma surface surf Lambert

                           struct Input {

                                float4 color : COLOR;

                                };

                                void surf  (Input In, inout SurfaceOutput  o){

                                        o.Albedo = 1;

                                }

                                ENDCG

                           }

                            Fallback "Diffuse"

                   }

表面着色器被定义在SubShader语义块(并非PASS语义块)中的CGPROGRAM与ENDCG之间。不用关心Pass,Unity在背后已经做了这些工作,这里的CG/HLSL是Unity经过封装后提供的,语法和标准几乎一样除了原生的函数和用法Unity未提供。

 

顶点/片元着色器:我们可以使用CG/HLSL语言来进行编写,更复杂且更灵活:

                Shader "Custom/Simple VertexFragment Shader"{

                        Pass{

                             CGPROGRAM

                              #pragma  vertex vert

                              #pragma fragment frag

                              float4 vert(float4 v : POSITION)  : SV_POSITION{

                                       return mul  (UNITY_MATRIX_MVP,v);

                              }

                              fixed4 frag()  :  SV_Target {

                                      return fixed4 (1.0,0.0,0.0,1.0);

                              )

                               ENDCG

                            }

                       }

                 }

和表面着色器类似顶点/片元着色器被定义在Pass语义块中的,在CGPROGRAM与ENDCG之间,这里仍使用HLSL和CG语言进行编写

 固定函数着色器:

               Shader "Tutorial/Basic"{

                          Properties{

                                   _Color ("Main Color",Color)  =  (1.0,0.5,0.5,1.0)

                          }

                          SubShader {

                                   Pass {

                                           Meaterial{

                                                 Diffuse [_Color]

                                            }

                                            Lighting  On

                                    }

                                 } 

                           }

固定函数着色器的代码被定义在Pass语义块中,这些代码相当于Pass中的一些渲染设置,再次我们需完全使用shaderlab语义而非HLSL/CG。对于多自定义的渲染效果我们经常使用顶点/片元着色器来进行UnityShader的编写。

                       

posted @ 2021-08-12 22:57  任葳  阅读(91)  评论(0)    收藏  举报