UnityShader

UnityShader学习笔记(二)-Fixed function shader 固定函数着色器

固定函数着色器(Fixed Function Shader)

固定函数着色器的功能有限,只能实现一些简单且固定的效果。不过固定函数着色器的速度更快,在所有的硬件平台都能得到良好的运行。实际上,现在绝大多数的GPU都支持可编程的渲染管线,固定渲染管线的编程方式也逐渐被淘汰掉。Berry在这里简单的记录一下Fixed Function Shader的常用命令(Material命令和SetTexture命令)

一个简单的固定函数着色器的代码示例

Shader "Custom/Simple"{
    Properties{
        _Color ("Main Color",Color) = (1,0.5,0.5,1)
    }
    SubShader{
        Pass{
            Material{
                Diffuse[_Color]
            }
            Lighting On
        }
    }
}

固定函数着色器的代码被定义在Pass语义块中,这里需要完全使用ShaderLab的语法。


1. 固定渲染管线中的Material命令块

Material命令块中的渲染设置命令

名称 说明 参数类型
Diffuse 材质的漫反射颜色,也就是物体本身的颜色 color类型rgba颜色值
Ambient 环境光,影响物体的颜色 color类型rgba颜色值
Specular 高光,影响物体的高光反射的颜色 color类型rgba颜色值
Shininess 高光反射强度,控制高光反射部分的区域的集中程度,值越大物体表现地越光滑 float浮点值
Emission 自发光,物体自身发光的颜色 color类型rgba颜色值

material{

diffuse[] //漫反射 参数为color
ambient[] //环境光 参数为color
specular[] //高光 参数为color
shininess[] //高光反射值 参数为float
emission[] //自发光 参数为color

}

在使用material来调整物体表面时,需要设置lighting(顶点光照)为on

在使用specular高光命令时,必须设置separatespecular独立镜面高光为on,同时添加shininess高光反射值来调整高光的反射值,shininess能够调整物体反光的集中点,可以体现物体的光滑程度(数值越大物体的表面越光滑)。

Material代码示例
Shader "Custom/FixedFunctionShader01" {
 
    Properties{
        _Color("MainColor",color) = (1,0,0,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)
    }
    SubShader{
        pass {
            //color(1,0,0,1) 
            //color[_Color] 
            material{
                diffuse[_Color] //漫反射光
                ambient[_Anbient] //环境光
                specular[_Specular] //高光
                shininess[_Shininess] //高光反射值
                emission[_Emission] //自发光
            }
            lighting on //开启光照
            separatespecular on //开启独立镜面高光
        }
    }
}​

材质面板下的预览效果


2. 固定渲染管线中的settexture命令

在固定函数着色器中可以使用settexture命令来为被渲染的物体添加纹理贴图。settexture命令在pass语义块中编写。

Shader "Custom/FixedFunctionSetTexture" {
	
	//参数为texture2d
	Properties {
		_MainTex("MainTexture",2d) = "white"{}
	}
	SubShader {
		pass{
		    //settexture命令的参数为2d贴图
			settexture[_MainTex]{
			    //combine命令合并贴图纹理
				combine texture
			}
		}
	}
}​

材质面板下的预览效果

如果想要混合顶点光照效果 需要使用 primary命令

Shader "Custom/FixedFunctionShader02" {
 
    Properties{
        _Color("MainColor",color) = (1,0,0,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("MainTexture",2d) = "white"{}
    }
    SubShader{
        pass {
            material{
                diffuse[_Color] //漫反射光
                ambient[_Anbient] //环境光
                specular[_Specular] //高光
                shininess[_Shininess] //高光反射值
                emission[_Emission] //自发光
            }
            lighting on //开启光照
            separatespecular on //开启独立镜面高光
            
            settexture[_MainTex]{
			    //combine命令合并贴图纹理
				combine texture * primary double
			}
        }
    }
}

材质面板下的预览效果

primary关键词表示之前material命令以及计算了光照后的颜色
double关键词表示将计算结果乘以二
quad关键词表示将计算结果乘以四
由于两个color相乘的结果要比其中任意一个结果都要小,combine texture * primary double表示贴图纹理的颜色和之前material命令中的颜色相乘并将结果乘以2,来提高两倍的亮度

previous关键词表示混合之前的texture纹理
连续使用两次settexure命令

 
settexture[Texture2d] { 
    combine texture * primary double 
} 
settexture[Texture2d] { 
    //这里的previous表示上一次settexture得到的纹理数据 
    combine texture * previous double 
}​ 
此时效果为两张贴图混合显示
贴图的混合次数与显卡硬件的性能有关,性能好的硬件可以混合更多次的Texture

ShaderLab中的Blending(混合命令)

Blend来控制透明度
命令 Blend SrcAlpha OneMinusSrcAlpha  当前颜色的Aplha值与1减去当前Aplha值得比例去混合场景中已经被渲染好的颜色值
在Pass通道中添加这一命令
pass{
        Blend SrcAlpha OneMinusSrcAlpha
}
同时要修改渲染队列,在SubShader语义块下添加Tags语义块
SubShader {
        Tags {"Queue" = "Transparent"}
}
Shader "Custom/FixedFunctionShader03" {
	 
	Properties{
		_Color("MainColor",color) = (1,0,0,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" {}

	}

	SubShader{
		Tags{ "Queue" = "Transparent" }
		pass {
		
		    Blend SrcAlpha OneMinusSrcAlpha
			material{
				diffuse[_Color] //漫反射光
				ambient[_Anbient] //环境光
				specular[_Specular] //高光
				shininess[_Shininess] //高光反射值
				emission[_Emission] //自发光
			}
			lighting on //开启光照
			separatespecular on //开启独立镜面高光

			settexture[_MainTex]{				
				combine texture * primary double
			}	
		}
	}
}

从预览效果中可以看出树莓屋logo的透明镂空部分

(0)

本文由 树莓屋 作者:Berry贝锐 发表,转载请注明来源!

关键词:

热评文章

发表评论