专栏首页Unity ShaderShader初学笔记:等值线
原创

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"

}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Shader初学笔记:一种三维等值线的算法

    把反距离加权算法转换到三维空间,是不是很方便的算出三维空间下的等值线了呢,再结合Shatter Toolkit插件进行剖切,修改修改代码。应该可以解决地层模型任...

    clawclaw
  • Shader初学笔记:简单色块红橙黄绿蓝靛紫白灰黑

    o.vertex = UnityObjectToClipPos(v.vertex);

    clawclaw
  • Shader初学笔记:简单参数传入随机颜色

    float4 vertex : POSITION;

    clawclaw
  • python修改linux中文件(文件夹)的权限属性操作

    今天生成的对流云团路径图片放在linux下,文件的权限都是rw,没有x,后续的别人的程序调用不了,这里附上对三个属性的简单解释,有不够的欢迎大家补充

    砸漏
  • 2015机器人创变奖花落谁家?候选名单大揭秘(下)

    文 | Robotics Trends 一年一度的Robotics Business Review创变奖(Game Changer Awards)旨在表彰机器人...

    机器人网
  • 深度学习——LeNetLeNet解析

    DC童生
  • SpringCloud必会知识点最全(精美版)

    Spring Cloud也是一样,它将现在非常流行的一些技术整合到一起,实现了诸如:配置管理,服务发现,智能路由,负载均衡,熔断器,控制总线,集群状态等等功能。

    CaesarChang张旭
  • 设计并实现同时支持多种视频格式的流媒体点播系统

    hbstream
  • 深度学习+EEG:一种采用单通道EEG检测被试注意力状态的卷积神经网络构架

    脑机接口(BCI)系统可以记录并处理大脑信号并将其转换为输出命令,其可用于各种应用场景,如辅助技术,神经康复和认知增强等。在各种用于脑信号记录的技术中,脑电图(...

    悦影科技
  • AlexNet论文阅读

    摘要主要介绍了其神经网络的结构——5个卷积层(每个卷积层($convolutional\ layers$)后面都跟有池化层($max-pooling\ lay...

    mathor

扫码关注云+社区

领取腾讯云代金券