UnityShader学习01

    科技2022-07-20  106

    Shader基本

    surface shaders(是对下一种shader的包装)vertex and fragment shadersfixed function shaders

    Unity使用ShaderLab syntax语法 不区分大小写 Shader lab基本结构

    Shader "Custom/ShaderName"{ //Custom为使用Shader时的分类目录,ShaderName为Shader名 Properties { //属性 //这里的属性会在Material的面板里显示 _Color ("Color", Color) = (1,1,1,1) //_Color是Shader里的变量名,"Color"是在Material里的变量名,后一个Color是ShaderLab里的类型,即Color类型,登号后面为默认值,使用0~1表示 _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { //在这里编写Shader代码,至少需要有一个SubShader //如果有多个SubShader,会自顶向下寻找第一个能运行的SubShader } FallBack "Diffuse" //当所有的SubShader都失败时,指定一个Unity内置Shader }

    Shader组成

    SubShader Tags 标签pass 渲染通道 material diffuseambientSpecularShininessEmission culling and depth testingBlendingPassTagStencilNameLegacy LightingLegacy Texture CombinersLegacy Alpha TestingLegacy FogLegacy BindChannels usepassgrabpass
    Fixed function shader

    使用一系列命令进行物体的着色 实现特定功能,运行快,硬件支持良好

    Shader "Custom/Test2" { Properties { _Color("MainColor",color) = (1,1,1,1) _Ambient("Ambient",color) = (0.3,0.3,0.3,0.3) _Specular("Specular",color) = (1,1,1,1) _Shininess("Shininess",range(0,8)) = 4 _Emission("Emission",color) = (1,1,1,1) _Constant("ConstantColor",color) = (1,1,1,0.3) _MainTex("MainTex",2D)="" _SecondTex("SecondTex",2D) = "" //如果下面有非贴图类型则需要把""改成"XXX"{} } SubShader { //ShaderLab: SubShader Tags。这里设置的是渲染队列 //简单来说是让远的物体先渲染,近的物体后渲染覆盖在上面 Tags { "Queue" = "Transparent"} //通道块 pass { //ShaderLab: Blending //Blending 决定游戏对象的渲染如何和已经渲染的物体(环境)相作用进行渲染,和PS的混合模式相似 //这里启用了透明度混合 Blend SrcAlpha OneMinusSrcAlpha //取消下一行注释将直接使用color进行渲染,一般不用 //color[_Color] material { //主颜色 diffuse[_Color] //环境光影响颜色 ambient[_Ambient] //高光颜色 Specular[_Specular] //高光 Shininess[_Shininess] //自发光 Emission[_Emission] } //启用顶点?光照 lighting on //高光将在贴图渲染后再渲染 Separatespecular on //设置贴图 Settexture[_MainTex] { //combine是关键词,texture指传参_MainTex,primary是指在material里计算的结果 //因为texture和primary数值都是0~1,相乘后将变暗,所以用double提高亮度 combine texture*primary double } Settexture[_SecondTex] { //添加一个传参,只能为Color类型 constantColor[_Constant] //previous是指上一个计算结果(这里是Settexture[_MainTex]) //,之后是指Alpha的通道将被单独计算 combine texture*previous double,texture*constant } //Settexture次数是有上限的,一般最少为2次,硬件越好可以混合越多次 } } }
    Processed: 0.010, SQL: 8