Shaderlab Notizen 13 单色透明Shader
2016-10-22 本文已影响0人
CarlDonitz
一、单色透明Shader
源码如下:
//透明单色Shader
Shader "Shader/SimpleAlphaShader"
{
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
Tags{ "Queue" = "Transparent" }
Pass
{
//不写入深度缓冲,为了不遮挡住其他物体
ZWrite Off
//选取Alpha混合方式
Blend SrcAlpha SrcAlpha
//Blend SrcAlpha OneMinusSrcAlpha
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP, vertexPos);
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void) : COLOR
{
//返回单色
return float4(0.3, 1.0, 0.1, 0.6);
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
二、颜色可调版单色透明Shader
让颜色可调,来一个Properties属性块,替换掉Hard encoding硬编码的颜色
源码如下:
//颜色可以调版单色透明Shader
Shader "Shader/ColorChangeAlpha"
{
//------------------------------------【属性值】------------------------------------
Properties
{
//颜色值
_ColorWithAlpha("ColorWithAlpha", Color) = (0.9, 0.1, 0.1, 0.5)
}
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
Tags{ "Queue" = "Transparent" }
//--------------------------------唯一的通道-------------------------------
Pass
{
//不写入深度缓冲,为了不遮挡住其他物体
ZWrite Off
//选取Alpha混合方式
Blend SrcAlpha SrcAlpha
//Blend SrcAlpha OneMinusSrcAlpha
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//变量声明
uniform float4 _ColorWithAlpha;
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP, vertexPos);
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void) : COLOR
{
//返回自定义的RGBA颜色
return _ColorWithAlpha;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
三、双面双色颜色可调版透明Shader
利用Cull语句,分别在两个Pass中Cull Front和Cull Back,以让材质的正面和反面显示出不同的颜色
源码如下:
//双面双色颜色可以调版透明Shader
Shader "Shader/TwoSideColorChangeAlpha"
{
//------------------------------------【属性值】------------------------------------
Properties
{
//正面颜色值
_ColorWithAlpha_Front("ColorWithAlpha_Front", Color) = (0.9, 0.1, 0.1, 0.5)
//背面颜色值
_ColorWithAlpha_Back("ColorWithAlpha_Back", Color) = (0.1, 0.3, 0.9, 0.5)
}
//------------------------------------【唯一的子着色器】------------------------------------
SubShader
{
//设置Queue为透明,在所有非透明几何体绘制之后再进行绘制
Tags{ "Queue" = "Transparent" }
//------------------------【通道1:渲染正面】-------------------------
Pass
{
//剔除背面,渲染正面
Cull Back
//不写入深度缓冲,为了不遮挡住其他物体
ZWrite Off
//选取Alpha混合方式
Blend SrcAlpha OneMinusSrcAlpha
//Blend SrcAlpha SrcAlpha
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//变量声明
uniform float4 _ColorWithAlpha_Front;
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP, vertexPos);
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void) : COLOR
{
//返回自定义的RGBA颜色
return _ColorWithAlpha_Front;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
//------------------------【通道2:渲染背面】-------------------------
Pass
{
//剔除正面,渲染背面
Cull Front
//不写入深度缓冲,为了不遮挡住其他物体
ZWrite Off
//选取Alpha混合方式
Blend SrcAlpha OneMinusSrcAlpha
//Blend SrcAlpha SrcAlpha
//===========开启CG着色器语言编写模块============
CGPROGRAM
//编译指令:告知编译器顶点和片段着色函数的名称
#pragma vertex vert
#pragma fragment frag
//变量声明
uniform float4 _ColorWithAlpha_Back;
//--------------------------------【顶点着色函数】-----------------------------
// 输入:POSITION语义(坐标位置)
// 输出:SV_POSITION语义(像素位置)
//---------------------------------------------------------------------------------
float4 vert(float4 vertexPos : POSITION) : SV_POSITION
{
//坐标系变换
//输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口
return mul(UNITY_MATRIX_MVP, vertexPos);
}
//--------------------------------【片段着色函数】-----------------------------
// 输入:无
// 输出:COLOR语义(颜色值)
//---------------------------------------------------------------------------------
float4 frag(void) : COLOR
{
//返回自定义的RGBA颜色
return _ColorWithAlpha_Back;
}
//===========结束CG着色器语言编写模块===========
ENDCG
}
}
}
材质最终表现出来的透明颜色,是这两种颜色的混合。
在实景表现中,从物体外部和内部,可以看到其显示出了不同的颜色。