美文网首页
Jtro的技术分享:ShaderLab开发(一)

Jtro的技术分享:ShaderLab开发(一)

作者: UnityPlane | 来源:发表于2018-12-19 12:35 被阅读18次

说在最前

首先,我不介绍shader干嘛的以及有什么用,直接都是干货。

那么首先从在unity中创建一个shader说起,与创建c#脚本相同,新建一个shader,然后选择shader的类型,这个类型随便选,一般是选择片面着色器。新建好shader之后,再新建一个材质球,shader的展示一般都是通过材质球来体现的

下面说一下shader的语法与结构

关键字:Shader,不管你的shader代码文件里面有多少行代码,都是通过shader这个关键字开始的。

Shader "Jtro/shader_mb"
{
    //首先声明一些参数
    Properties{
        _MainTex ("Base(RPG)",2D) = "white" {}
    }
    //子shader,一般有多个子shader,因为许多型号的pc、手机的配置多样,这时系统会根据硬件的配置选择一个最适合的子shader使用
    SubShader
    {
    
    }
    //回滚,如果子shader没有一个是适用当前的平台,那么就启用回滚,这个是保证在平台运行的时候有一个shader启用
    FallBack "Diffuse"
}

一般的一个shader文件中会有多个subshader代码块,为什么呢,因为现实中每个人用的显卡不尽相同,显卡的种类千差万别,为了让玩家能看到最好的效果,就会写若干个子shader代码块,一般写两三个就够了,一个是针对目前最流行的显卡,一个针对老旧的显卡
shader中最重要的标签(Tags{})

              //这个是重要标签,Tags{}块
        Tags {"Queue"= "Geometry""RenderType"= "Opaque""IgnoreProjector"= "True"}
        /*
        Queue就是队列的意思,在这里就是渲染队列的意思
        RenderType
        IgnoreProjector
        */···

Subshader中的pass块,subshader中包装了一个渲染方案,而这些方案都是由一个个Pass块来执行的,subshader中同样的也可以包含多个pass代码块。

SubShader
    {
        //这个是重要标签,Tags{}块
        Tags {"Queue"= "Geometry""RenderType"= "Opaque""IgnoreProjector"= "True"}
        /*
        Queue就是队列的意思,在这里就是渲染队列的意思
        RenderType
        IgnoreProjector
        */
        Pass 
       {
          Name "YINYONG"//这里的名字必须全部大写
          Material 
         {
            Diffuse (1,0.7,0.7,1)
            Ambient (1,0.7,0.7,1)
         }
        Lighting On
        SetTexture[_]{combine primary}
       }
    }

这里有一个重要的功能,引用其他shader文件中的代码块,这样就可以减少重复劳动,

Subshader {
   SubShader {
         UsePass "路经:/pass代码块名称"
       }
}

最后一个是回滚操作,这里注意,在开发的时候一般不适用回滚,只有在实际应用发布时才会为了追求平台最大适用性而加上

在unity的shader编写中,可以使用2中语言来写
第一种是:GLSL, 如果使用了GLSL来写,这些代码必须位于GLSLPROGRAM和ENDGLSL之间
第二种是:cG/HLSL,如果使用了cG/HLSL,这些代码必须位于CGPROGRAM和ENDCG之间
本文集使用的是cg语言。

相关文章

网友评论

      本文标题:Jtro的技术分享:ShaderLab开发(一)

      本文链接:https://www.haomeiwen.com/subject/drydkqtx.html