PS 其实这个东西在之前的镜像水面也已经用过了,现在在这里详细的描述一下
在代码中设置shader图片
关键代码如下:
//获取对象的材质
void Start () {
if (material == null) {
Renderer renderer = gameObject.GetComponent<Renderer>();
if (renderer == null) {
Debug.LogWarning("Cannot find a renderer.");
return;
}
material = renderer.sharedMaterial;
}
_UpdateMaterial();
}
//更新材质,其中最重要的就是将生成的Texture2D赋值给Shader中对应的图片属性
private void _UpdateMaterial() {
if (material != null) {
m_generatedTexture = _GenerateProceduralTexture();
//将m_generatedTexture赋值给材质shader的“_MainTex”
material.SetTexture("_MainTex", m_generatedTexture);
}
}
//生成一张Texture2D,具体要对这张图片做什么处理可以后面代码加
private Texture2D _GenerateProceduralTexture() {
Texture2D proceduralTexture = new Texture2D(textureWidth, textureWidth);
......
}
总结:大体上分3步走
①获取对象身上的材质
②生成一张Texture2D的贴图
(3.5 可以在这里对贴图做处理)
③将生成的贴图赋值给材质的shader
(④在shader中对第三步的贴图进行处理最后显示在屏幕上)
在代码中设置shader的其他属性汇总
这些方法都在 UnityEngine.Material类中:
bool HasProperty(string name) //检查材质的shader是否存在名为name的属性
void SetColor(string name, Color value) //设置材质的shader名为name的颜色值
void SetFloat(string name, float value) //设置材质的shader名为name的float值
void SetInt(string name, int value) //设置材质的shader名为name的int值
void SetMatrix(string name, Matrix4x4 value) //设置材质的shader名为name的matrix值
void SetTexture(string name, Texture value) //设置材质的shader名为name的texture值
void SetVector(string name, Vector4 value) //设置材质的shader名为name的vector值
//上述的 string name都可以替代为 int nameID ,即用属性的id来替代名字,并且使用nameID可以极大的提升性能
//nameID是shader属性名称的唯一标识符
//上述属性都有下述对应方法的变形
//Color GetColor(string name)
//Color GetColor(int nameID)
//void SetColorArray(string name, List<Color> values)
//void SetColorArray(int nameID, List<Color> values)
//void GetColorArray(string name, List<Color> values)
//void GetColorArray(int nameID, List<Color> values)
//对于Array,经过测试结果如下:
/*
如果是float、int这种本身就是单元的,则返回{float,float,float}或{int,int,int}
如果是Color、Vector这种本身就是单元的,则返回{Color,Color,Color}或{Vector,Vector,Vector}
并且上述列表中的每个值都是相同的
*/
下面是使用 nameID的样例:
//获取对应的材质
objMat = obj.GetComponent<MeshRenderer>().sharedMaterial;
//获取属性的唯一id
nHash = Shader.PropertyToID("n");
......
var n = plane.transform.up;
//通过id设置属性
objMat.SetVector(nHash, n);
健壮的代码:
通常为了使代码结构更为健壮,我们通常会在使用某个变量的时候会先判断变量是否存在,有值等等,设置属性也同理,样例如下
//要先判断材质的shader中是否存在该属性
if( mat.HasProperty("_Ref") )
mat.SetTexture( "_Ref", m_ReflectionTexture );
PS.关于 GetColorArray这类函数该用于何处,现在还不是很清楚,如果你知道!欢迎私聊,不然就留着以后填坑了