Unity3d在runtime中改变material渲染模式

本文介绍了如何在Unity3D中通过脚本动态改变材质的渲染模式,涉及SetFloat、SetInt和Enable/DisableKeyword等方法,以及不同渲染模式的设置,如_Opaque、_Cutout、_AlphaTest、_AlphaBlend和_AlphaPremultiply。通过示例代码,最终实现了玻璃材质的效果。参考链接提供了更多相关信息。

material.SetFloat("_Mode",3);


material为实例化的Material,这个顺序和inspecter看到的应该是一样的 0是Opaque 1是cutout  以此类推

用了这个发现inspecter里面模式是改变了,但是没有达到预期的效果

http://forum.unity3d.com/threads/access-rendering-mode-var-on-standard-shader-via-scripting.287002/#post-1961025

然后跑到这里 看到了这个

  1.                 material. SetFloat ( "_Mode"2 );
  2.                 material. SetInt ( "_SrcBlend"
### 创建温度场可视化云图效果 为了在Unity3D中创建温度场的可视化云图效果,可以采用多种方法和技术来实现这一目标。一种有效的方式是利用Shader编程和计算着色器(Compute Shader),通过GPU加速处理大量数据点的颜色映射。 #### 使用Shader与材质球 首先定义一个自定义Shader用于绘制温度颜色梯度[^2]: ```csharp // TemperatureMap.shader Shader "Custom/TemperatureMap" { Properties { _MainTex ("Texture", 2D) = "white" {} _ColorGradient ("Temperature Color Gradient", 2D) = "gray" {} } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; }; sampler2D _MainTex; sampler2D _ColorGradient; v2f vert (appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : COLOR { // Sample the texture and apply color gradient based on temperature value. half tempValue = tex2D(_MainTex, i.uv).r; // Assuming red channel holds normalized temperature data // Apply a smooth transition through colors using the provided gradient map. fixed4 col = tex2D(_ColorGradient, float2(tempValue, 0)); return col; } ENDCG } } } ``` 接着,在场景中创建网格物体作为显示载体,并为其分配上述编写的Material材料球[^3]。 #### 动态更新温度分布 对于需要实时变动的情况,则可以通过脚本来控制Mesh上的顶点属性或者纹理贴图的内容,从而达到动态改变视觉表现的目的。这里推荐使用`ComputeBuffer`配合compute shader来进行高效的并行运算操作。 ```csharp using UnityEngine; public class DynamicHeatmapController : MonoBehaviour { private ComputeShader computeShader; private RenderTexture heatmapRT; private Material material; void Start() { // Initialize resources... int width = Screen.width / 2; int height = Screen.height / 2; heatmapRT = new RenderTexture(width, height, 24, RenderTextureFormat.ARGBFloat); heatmapRT.enableRandomWrite = true; heatmapRT.Create(); material.SetTexture("_MainTex", heatmapRT); // Dispatch computation to update heat values over time or interactively. computeShader.Dispatch(/* ... */); } void Update() { // Optionally dispatch more computations here during runtime as needed. } void OnDisable() { if (heatmapRT != null && !Application.isEditor) { DestroyImmediate(heatmapRT); } } } ``` 以上代码片段展示了如何设置渲染纹理以及调用compute shader执行必要的数值模拟或转换逻辑。 #### 数据源集成 最后一步就是考虑实际应用中的数据获取方式。如果是在游戏或其他交互式应用程序内部生成的话可以直接访问内存里的结构体;而如果是外部导入则可能涉及到文件解析或是网络请求接口的设计[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值