【Unity Shader】 Fixed function shader(固定管线着色器)

一、介绍

fixed function shader(固定渲染管线shader),是相对于可编程的shader而言的。
所谓固定管线,是说芯片上一组电路已经固定实现了特定的运算功能,程序能做的只是提供场景数据以及微调运算功能的参数。
它适用于所有的显卡,常用于高级Shader在老显卡无法显示时的Fallback。
Unity中的固定管线shader使用ShaderLab语言。

固定渲染的整个渲染过程就好像是在流水线上的每一道工序上面都有几个可选的开关,想实现不同的效果,花式扳开关就好了。

它的灯光公式、贴图方式等是固定的,不能自定义的修改,我们只能控制功能的开和关

二、结构

unity shader通用结构

//shader的名字会显示在unity的inspector中选择shader的菜单里面
Shader "Shader的路径和名称"{
    //属性
    [Properties]

    //可能存在多个subshader。Unity会在所有的subshader列表中选中第一个硬件可以支持的subshader
    SubShader{
        //SubShader的标签
        //[Tags]

        //给该SubShader中所有pass公用的设置
        //[Common State]
        [Common Tags]

        //可能存在多个pass,每个pass都会引起一次渲染
        Pass{
            //该Pass的标签
            [Tags]

            //渲染设置,如颜色混合
            [Render Setup]

            //纹理设置,只有在fixed function shader中才可用
            [Texture Setup]
        }

        //可以有其他的Pass
        [其他的Pass]
    }

    //可以有多个SubShader
    [其他的SubShader]

    //当所有的subshader失败时,使用Fallback指定的shader
    [Fallback]

    //当有自定义shader的设置UI时候用
    [CustomEditor]
}

一个Pass表示一个渲染管线,当存在多个Pass时,即在前一Pass结束后,依据得到的缓存数据和状态开始下一个Pass管线,直到所有Pass管线渲染结束

三、语法

1. Color 设置顶点颜色
Color(R,G,B,A)
Color[变量名]

给物体一个固定的颜色,颜色值可以是一个RGBA数据也可以是一个color变量名。

调节顶点的颜色:
Shader "fixed shader/color"
{
    Properties
    {
        _MainColor("Main Color", Color) = (1,1,1,1)
    }
    SubShader
    {

        Pass
        {
            //Color(0,1,0,1)
            Color[_MainColor]
        }
    }
    Fallback "Diffuse"
}

这里写图片描述

2. 灯光开关

(1)Lighting 灯光总开关

Lighting On/Off

灯光开关,如果想要灯光效果,必须使用[Lighting On]命令,否则如果使用[Lighting Off],那么直接由Color Command直接决定最终的显示效果。

(2)SeparateSpecular 反射高光开关

SeparateSpecular On/Off

默认情况下primary颜色是漫反射,阴影色和高光颜色(在光线计算中定义)的加和。如果你将通道设置中的SeparateSpecular On,高光色会在混合计算后被加入,而不是之前,只有Lighting On的时候才生效。

3. 材质信息
Material {Material Block}

Material Block 材质信息块
这些是为了设置材质如何影响光照。任何这些属性都能被排除,在这种情况下它们被认为默认为黑色(没起到效果)。
- Diffuse Color 漫反射颜色
这个是物体最基础的颜色。
- Ambient Color 环境色
当物体被环境光影响时候给物体设置颜色,这个取决于在RenderSettings中设置的环境颜色。
- Specular Color 反射光
设置物体的高光反射颜色
- Shininess Number 清晰度
突出清晰度,值在0和1之间。为0时候,你得到1个巨大的高光看起来像很多漫射光照;为1时候,你得到一个小的斑点。
- Emission Color 自发光颜色
当没被其他光线影响时候,物体本身的自发光颜色。

当物体被所有光线照射时候他的颜色的计算公式如下:

Ambient * RenderSettings ambient setting +(LightColor * Diffuse + Light Color * Specular) + Emission

在括号中的那部分光线计算,是计算所有照射到物体上的光线。
通常情况下,你要保持漫反射和环境的颜色相同(所有内建的Unity3dshader 都是这么做的)。

调节材质的光照效果:
Shader "fixed shader/materialsettings" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
    }

    SubShader {
        Pass {
            // Set up basic vertex lighting
            Material {
                Diffuse [_Color]
                Ambient [_Color]
                Shininess [_Shininess]
                Specular [_SpecColor]
                Emission [_Emission]
            }
            Lighting On
            SeparateSpecular On
        }
    }
}

这里写图片描述

4. SetTexture命令

纹理在基本的顶点光照被计算后被应用。在着色器中通过SetTexture 命令来完成。

材质贴图可以用来做老风格的混合器效果。你能在一个通道中使用多个SetTexture命令

所有纹理被顺序的应用,如同绘画程序中的层一样(顺序覆盖)。SetTexture 命令必须放置在通道的末尾。

SetTexture [TextureName] { TextureBlock }
显示纹理:
Shader "fixed shader/settexture" {
    Properties {
        _Tex1("Tex1", 2D) = "white"{}
        _Tex2("Tex2", 2D) = "white"{}
    }

    SubShader {
        Pass {
            SetTexture[_Tex1]
            SetTexture[_Tex2]
        }
    }
}

这里写图片描述
TextureName指定加载哪张纹理。TextureBlock指定纹理如何应用。

5. SetTexture TextureBlock内其他命令

纹理块控制纹理如何被应用。

在纹理块中能执行2种命令:合并combine、constantColor。
(1)combine命令:
combine src1 * src2 :将源1和源2的元素相乘。结果会比单独输出任何一个都要暗
combine src1 + src2 : 将源1和源2的元素相加。结果会比单独输出任何一个都要亮
combine src1 - src2 :源1 减去 源2
combine src1 lerp (src2) src3 使用源2的透明度通道值最为标准对源3和源1中进行差值,注意差值是反向的:当透明度值是1是使用源1,透明度为0时使用源3
combine src1 * src2 + src3源1和源2的透明度相乘,然后加上源3

所有src都可以是previous, constant, primary or texture其中的一个。
- Previous 上一次SetTexture的结果
- Primary 来自光照计算的颜色或是当它绑定时的顶点颜色
- Texture 在SetTexture中被定义的纹理的颜色
- Constant 被ConstantColor定义的颜色

(2)constantColor纹理块命令
ConstantColor color 定义能在combine命令中使用的常量颜色

alpha混合两张纹理:
Shader "fixed shader/Alpha Blended Textures" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BlendTex ("Alpha Blended (RGBA) ", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Apply base texture
            SetTexture [_MainTex] {
                combine texture
            }
            // Blend in the alpha texture using the lerp operator
            SetTexture [_BlendTex] {
                //combine texture lerp (texture) previous
                combine previous lerp (texture) texture

            }
        }
    }
}

这里写图片描述

#### 参考:
可编程渲染管线比固定管线的优势在哪?有什么应用?
ShaderLab: Legacy Lighting
ShaderLab: Legacy Texture Combiners
Fixed Function Shader(固定渲染管线)
Unity3D shader(1)——fixed shader

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页