zoukankan      html  css  js  c++  java
  • unity shader入门(一):基本结构话痨版

    unity shader 有三种形式:表面着色器(Surface Shader),顶点/片元着色器(Vertex/Fragment Shader),固定函数着色器(Fixed Function Shader)

    表面着色器是unity自创的一种着色器代码类型,在本质上与顶点/片元着色器是一样的,可以理解为表面着色器是对顶点/片元着色器的以更高一级的抽象。

    顶点/片元着色器可以使用CG/HLSL语言编写,它比表面着色器更复杂也更灵活。

    由于有些老旧设备(如iphone3)不支持可编程管线着色器,就需要用固定函数着色器,这些着色器往往值能实现一些简单效果。在unity5.2中,固定函数着色器在背后会被编译成顶点/片元着色器。

    所以以下只介绍顶点着色器

    下为一个简单的顶点/片元着色器

    Shader "Custom/NewShader" {
    //NewShader为这个着色器的名字,Custer为路径 Properties{
          //Properties为属性,下面会给出各种类型的属性
      _Range("Range",Range(0.0,1))=1   _Color("Color Tint",Color)=(1,1,1,1)

          //_Range和_Color为声明的两个属性 } SubShader{
          //一个着色器可以有多个SubShader,渲染时如果显卡不能使用第一个SubShader那么显卡会依次查找下一个SubShader,如果都不能使用,
          //那么会使用FallBack的着色器
          Tags{"RenderType"="Opaque"}
          Cull Off //Tags为一个标签,定义在SubShader下的Tags会对该SubShader下的所有Pass代码块都起作用,
         //也可以在Pass里面为该Pass单独定义Tags,但是不能在Pass下声明SubShader类型的标签。在下面给出SubShader的标签类型

         //Cull Off为一个状态,出现在SubShader下还是Pass下与Tags一样,下面给出常见状态设置 Pass{
              //Pass语块,下面给出Pass语块结构 Tags{"LightMode"="ForwardBase"}                //Pass标签

                  //开始CG代码片段 CGPROGRAM               //顶点/片元着色器需要写在CGPROGRAM和ENDCG之间


                  //该代码片段的编译指令,这里这两条编译指令告诉Unity 名为vert的函数包含了顶点着色器代码,
                  //名为frag的函数包含了片元着色器代码 #pragma vertex vert #pragma fragment frag   
                   //CG代码
                  
                  //为了能够使用Properties中定义的属性这里要做一个匹配 fixed _Range; fixed4 _Color;               
                  //顶点着色器,逐顶点执行的
                  //就跟一般函数一样有返回值,参数,方法体 float4 vert(float4 v:POSITION):SV_POSITION{               //float4 v:POSITION,还有后边的SV_POSITION 都是CG/HLSL中的语义,告诉系统用户需要输入那些输入值,以及输出的是什么
                  //这里POSITION告诉unity把模型的顶点填充到参数v中,SV_POSITION告诉unity输出的是裁剪空间中的顶点坐标,这些语义不可省略
                  //语义以后再说吧...
                       
                      //UnityObjectToClipPos(v)意思就是把顶点v从模型空间转换到裁剪空间 return UnityObjectToClipPos(v); }

                  //片元着色器 fixed4 frag():SV_Target{
                  //SV_Target语义告诉渲染器把用户的输入颜色存储到一个渲染目标中,这里将输出到默认的帧缓存               //没有输入,只是简单的输出了表示颜色的fixed4的变量,(0,0,0)表示黑色,(1,1,1)表示白色 return fixed4(_Color)*_Range; }
                  //结束CG代码片段 ENDCG               //其他设置 }
    //Pass{}//其他Pass语块 } //SubShader{}//其他显卡的SubShader FallBack "Diffuse"//上面所有SubShader在该显卡上都不能使用时使用这个,这里的写法会向其他物体投射阴影,换成FallBack Off就不能,这里不说明了。。。 }

      Properties语义块支持的属性类型

    SubShader的标签类型

    SubShader的标签是一个键值对,它的键和值都是字符串类型,用来告诉UNITY的渲染引擎我们希望怎么以及何时渲染这个对象

    常见的渲染状态设置

    这些指令设置显卡的各种状态,比如是否开启混合/深度测试

    Pass语块结构

    Pass{

    [Name]

    [Tags]

    [RenderSetup]

    //其他代码

    }

    通过Pass的名称(如 Name "MyPass")可以使用ShaderLab的UsePass命令类直接使用其他unity shader 的Pass提高代码复用

    如 UsePass "MyShader/MYPASS",注意,使用UsePass命令是必须使用大写

    Pass标签,也是告诉引擎怎么渲染物体的,下为Pass标签类型

    渲染状态设置,SubShader中的设置同样适用于Pass

    效果图如下

  • 相关阅读:
    将PHP文件生成静态文件源码
    Entity Framework Code First 学习日记(6)一对多关系
    Entity Framework Code First 学习日记(5)
    Entity Framework Code First 学习日记(3)
    Entity Framework Code First 学习日记(7)多对多关系
    Entity Framework Code First学习日记(2)
    Entity Framework Code First 学习日记(8)一对一关系
    Entity Framework Code First 学习日记(9)映射继承关系
    Entity Framework Code First 学习日记(10)兼容遗留数据库
    Entity Framework Code First 学习日记(4)
  • 原文地址:https://www.cnblogs.com/lanrenqilanming/p/7700633.html
Copyright © 2011-2022 走看看