Property学习
一、Property属性块的基本用法
1.1 先声明
现在Properties中声明变量
1 2 3 4 5 6 Properties { _MainColor("Main Color" ,Color) = (1 ,1 ,1 , 1 ) _ColorIntensity("Color Intensity" ,Range(0 ,1 )) = 1 _MainTex("Main Texture" ,2 d) = "white" {} }
1.2 再定义
1 2 3 4 5 6 7 8 Subshader{ pass{ float _ColorIntensity; float4 _MainColor; TEXTURE2D(_MainTex); SAMPLER(sampler_MainRex); } }
1.3 再使用
1 2 3 4 5 6 7 8 9 10 Subshader{ pass{ float4 frag (v2f IN) :SV_TARGET { float4 mainTexColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex,IN.uv); return mainTexColor * _MainColor * _ColorIntensity; } } }
1.4 整体代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 Shader "StudyShader/BasicShader" { Properties { _MainColor("Main Color" ,Color) = (1 ,1 ,1 , 1 ) _ColorIntensity("Color Intensity" ,Range(0 ,1 )) = 1 _MainTex("Main Texture" ,2 d) = "white" {} } Subshader { LOD 600 pass { HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #pragma vertex vert #pragma fragment frag float _ColorIntensity; float4 _MainColor; TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); struct appdata { float3 pos : POSITION; float2 uv:TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float2 uv:TEXCOORD0; }; v2f vert (appdata IN) { v2f OUT = (v2f)0 ; OUT.pos = mul(UNITY_MATRIX_MVP, float4(IN.pos, 1 )); OUT.uv = IN.uv; return OUT; } float4 frag (v2f IN) :SV_TARGET { float4 mainTexColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex,IN.uv); return mainTexColor * _MainColor * _ColorIntensity; } ENDHLSL } } Fallback "Hidden/Universal Render Pipeline/FallbackError" }
1.4 效果
二、Property属性块的脚本传参方式
1.1 material 字段
只改变挂载的物体的shader属性,且只在运行时有用
因此如果两个物体都挂载此脚本,则互不干扰其材质
1 2 Material mat = GetComponent<MeshRenderer>().material; mat.SetColor("_MainColor" , Color.red);
1.2 sharedMaterial 字段
改变所有使用该shader的物体的shader属性,且是永久性的修改,运行结束后,shader也被修改了
因此如果两个物体都使用了相同的shader,则运行时及运行后,两个物体的材质属性都修改为了运行时的状态
1 2 Material mat = GetComponent<MeshRenderer>().sharedMaterial; mat.SetColor("_MainColor" , Color.red);
1.3 多个不同颜色的shader手动处理方式
如果不想通过代码修改不用物体的材质颜色,则复制一份材质,将物体修改为复制后的材质,修改材质颜色
1.4 动态修改纹理图
创建一个渲染纹理(这里用相机拍的照片) ,资源文件夹右键->Create->Render Texture,命名为MainSceneRT
场景新建一个Camera,命名为MainSceneRTCamera,将MainSceneRT拖拽到MainSceneRTCamera下的Output的Output Texture上
修改代码
1 2 3 4 5 6 7 public Texture mainSceneRT;void Start (){ Material mat = GetComponent<MeshRenderer>().material; mat.SetTexture("_MainTex" , mainSceneRT); }
MainSceneRT资源拖拽到脚本上mainSceneRT处
1.5 同时改变不同shader的属性,且不用将脚本挂载在物体上
使用 Shader.SetGlobalFloat(“属性名”,数值)
使用时需要将shader中原有的在property中定义的属性名给删掉,不然会报错
运行结束后,不会恢复原本的属性,保持运行时的属性
1.5 效果
使用material字段,两个物体颜色互补影响
使用sharedMaterial字段,两个物体颜色被统一了,并且结束运行后,材质的颜色也被修改了
动态修改纹理图效果