您现在的位置是:首页 >技术交流 >Fixed Function Shader网站首页技术交流

Fixed Function Shader

贪小心 2024-06-17 10:43:20
简介Fixed Function Shader

Properties 属性

Shader语法不区分大小写

基础的数据类型

如何定义一个属性

  • 属性要在"Properties{}"代码块中定义

 Properties{
        _Color("Main Color",Color) = (1,1,1,1)
        _Shininess("Shininess",range(0,8)) = 4
        _MainTex("MainTex",2D) = ""{}
}
  • 一个属性的组成

   _Color("Main Color",Color) = (1,1,1,1)
  1.  _Color:属性名字(在之后的代码块中,调用到这个属性时,使用的名字)
  2. "Main Color":在Unity中,我们在面板中看到的名字
  3. Color:数据类型
  4.  (1,1,1,1):数据的默认值

SubShader  shader代码块    

一个Shader中可以存在一个或多个"SubShader{}",但是显卡每次渲染处理的时候只能选择一个SubShaders执行

执行顺序是最先处理最上方的"SubShader{}",如果显卡版本不支持第一个"SubShader{}",就会依次执行下面的"SubShader{}"

在编写多个"SubShader{}"时,一般第一个是最复杂的,对显卡要求最高,依次写更支持低版本显卡的"SubShader{}",越往下,算法和指令越简单

Pass 通道

"Pass{}"写在SubShader{}代码块中

"Pass{}"包含了一系列的渲染状态设置命令

Name

通过Name命令,给Pass通道设置名字,这个名字可以通过C#脚本访问到

  Pass{    
              Name "ExampleNamedPass"
}

Tag 

标签是可以分配给通道的键值对数据。Unity 使用预定义的标签和值来确定如何以及何时渲染给定的通道。您还可以使用自定义值创建自己的自定义通道标签,并从 C# 代码访问它们。

Shader "Examples/SinglePass"
{
    SubShader
    {
        Pass
        {                
              Name "ExamplePassName"
              Tags { "ExampleTagKey" = "ExampleTagValue" }

              // ShaderLab commands go here.

              // HLSL code goes here.
        }
    }
}

例如

  • 设置材质球属性
  • 设置光照
  • 设置贴图属性
  • 设置透明度

Material 材质

Diffuse[_Color] _color是在Properties中定义的属性

  Material{
                Diffuse[_Color]         //材质球颜色
                Ambient[_Ambient]       //材质球环境光
                Specular[_Specular]     //高光    搭配 Separatespecular 使用
                Shininess[_Shininess]   //高光强度
                Emission[_Emission]     //自发光
}
            Separatespecular On         //独立的镜面的高光效果 打开

Lighting 光照

 Lighting On                 //光照效果 打开  (off关闭)

Settexture 贴图

   Settexture[_MainTex]        //设置贴图 Settexture只能设置一张贴图
            {
                combine texture * primary double    //combine-混合    texture-贴图    primary-之前计算好的顶点光照    (double-数值翻倍,quad-数值×4)
            }
             Settexture[_SecondTex] 
            {
                constantColor[_Constant]                                //生成 constant 的颜色信息 
                combine texture * previous double , texture * constant  //previous-之前所有顶点光照贴图计算的数据     ,texture-在","添加texture,意思是使用贴图的透明通道信息    constant贴图再混合一个color属性调整透明度
            }

 完整代码

Shader "Custom/TestShader"
{
    Properties{
        _Color("Main Color",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)
        _MainTex("MainTex",2D) = "white"{}
        _SecondTex("SecondTex",2D) = ""{}
        _Constant("ConstantColor",Color) = (1,1,1,0.3)
    }

    SubShader
    {
        Tags { "Queue"="Transparent" }          //设置渲染顺序
        Pass{
            Blend SrcAlpha OneMinusSrcAlpha     //混合透明通道
            //Color(1,0,0,1)
            //Color[_Color]

            Material{
                Diffuse[_Color]         //材质球颜色
                Ambient[_Ambient]       //材质球环境光
                Specular[_Specular]     //高光    搭配 Separatespecular 使用
                Shininess[_Shininess]   //高光强度
                Emission[_Emission]     //自发光
            }
            Lighting On                 //光照效果 打开  (off关闭)
            Separatespecular On         //独立的镜面的高光效果 打开

            Settexture[_MainTex]        //设置贴图 Settexture只能设置一张贴图
            {
                combine texture * primary double    //combine-混合    texture-贴图    primary-之前计算好的顶点光照    (double-数值翻倍,quad-数值×4)
            }
             Settexture[_SecondTex] 
            {
                constantColor[_Constant]                                //生成 constant 的颜色信息 
                combine texture * previous double , texture * constant  //previous-之前所有顶点光照贴图计算的数据     ,texture-在","添加texture,意思是使用贴图的透明通道信息    constant贴图再混合一个color属性调整透明度
            }
        }
    }
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。