首先参见一篇文章:shader code 温度云图(温场)实现
http://www.cnblogs.com/lpcoder/p/7103634.html
里面有个BUG,第67行和第70行几个数组变量加上[i]即可正常运行。
程序采用反距离加权算法计算温度,先研究一下该算法就能看懂代码。
程序以四个顶点和三个已知点,共七个点,作为反距离加权算法的已知点。
参考该代码,结合参数传入,就可以得到自己想要的等值线图了。
补上代码
//script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ForShader : MonoBehaviour {
void Start () {
var pts = new Vector4[100];
for (int i = 0; i < 100; i++)
{
pts[i] = new Vector3(Random.value, Random.value, Random.value * 100);
}
Shader.SetGlobalInt("_len", pts.Length);
Shader.SetGlobalVectorArray("_pts", pts);
}
void Update () {
}
}
//shader:
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "等值线"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
AlphaTest Greater 0.1
pass
{
CGPROGRAM
#pragma target 3.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _pts[1000];
//x,y,z,其是float3就可以了,但是Shader.SetGlobalVectorArray只支持vector4,长度>=1024就不行了?
int_len;//数组的真实长度
struct v2f
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
float IDW(float2 uv)
{
float m = 0;
float n = 0;
for (int i = 0 ; i < _len ; i++)
{
float dp = sqrt((uv.x-_pts[i].x)*(uv.x-_pts[i].x)+(uv.y-_pts[i].y)*(uv.y-_pts[i].y));
m = m + 1/dp;
n = n + 1/dp*_pts[i].z;
}
return n/m;
}
float4 frag(v2f i):SV_Target
{
float4 outp;
float temp = IDW(i.uv);
//下面这段代码没改,根据自己的需求调整
if(temp >= 60)
//温度60到100度之间时红色, 并加黄色
outp = float4(1,0,0,1)*(temp-60)/40+float4(1,1,0,1)*(1-(temp-60)/40);
else if(temp >= 30)
//温度30到60之间时黄色,并加绿色
outp = float4(1,1,0,1)*(temp-30)/30+float4(0,1,0,1)*(1-(temp-30)/30);
else
//温度<30时绿色,并加蓝色
outp = float4(0,1,0,1)*(temp)/30+float4(0,0,1,1)*(1-(temp)/30);
return outp;
}
ENDCG
}
}
FallBack "Diffuse"
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。