前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shader初学笔记:等值线

Shader初学笔记:等值线

原创
作者头像
clawclaw
修改2018-03-27 15:56:40
1.7K5
修改2018-03-27 15:56:40
举报
文章被收录于专栏:Unity ShaderUnity Shader

首先参见一篇文章: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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档