UnityShader_代码中常用的控制shader属性的函数

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 );

Unity官方资料链接

PS.关于 GetColorArray这类函数该用于何处,现在还不是很清楚,如果你知道!欢迎私聊,不然就留着以后填坑了

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值