
//定义材质球菜单路径位置与名称
Shader "CRLuo/CRLuo_Teaching01_ColorMultiply"
{
Properties
{
//定义面板属性,获取外部输入颜色
_Color("颜色",Color)=(1,0,0,1)
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
//自定定义颜色变量(如果名称与属性表中一致,获取外部属性值)
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
//把自定义颜色乘给颜色
col *=_Color;
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
创建材质球

指向自定义Shader

使用效果

这里使用了相乘的方法完成了颜色混合。

混合的常用算法是 “+” 和 “*”,“+”对应灯光类发光物体,“*”对应油墨类,不发光物体。

第二个红框中新加了一个 颜色 Color类型属性。其余所有属性为:
Shader "CRLuo/CRLuo_Teaching02_AllAttribute"{
Properties{
//数据
_Int ("整型",Int)=0
_Float("浮点",Int)=0.1
_Range("滑块",Range(0.0,1.0))=0.5
_Color("颜色",Color)=(1,1,1,1)
_Vector("四维数",Vector)=(0,0,0,1)
//贴图
_2D ("2D贴图",2D)="white"{}
_Cube ("环境球贴图",Cube)="white"{}
_3D ("3D坐标系贴图",3D)="black"{}
}
//无定义时使用的备用Shader
FallBack "Diffuse"
}
使用结果:

定义数据时使用了 fixed(短浮点数)来定义颜色,因为颜色都是0~1的数据,节省显卡数据空间的开销。

所有数据类型
1、float,32位浮点数据
2、half,16位浮点数据
3、int,32位整形数据
4,fixed,12位浮点数
5、bool,布尔数据
6、sampler,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。
本文介绍了在Unity中自定义Shader实现颜色相乘混合的效果,并展示了如何定义材质球菜单路径、属性和不同数据类型。通过Shader代码示例,解释了颜色混合原理以及如何使用滑块、颜色选择器等属性类型。此外,还提到了数据类型如float、half、int、fixed在Shader中的应用。

被折叠的 条评论
为什么被折叠?



