zoukankan      html  css  js  c++  java
  • shader code 温度云图(温场)实现

    Shader "Custom/TemperatureField" {
    Properties {
    _MainTex ("Base (RGB)", 2D) = "white" {}
    _Point1("Temperature1",Range(0,100)) = 50
    _Point2("Temperature2",Range(0,100)) = 50
    _Point3("Temperature3",Range(0,100)) = 50
    _Point4("Temperature4",Range(0,100)) = 50
    }
    SubShader {
    AlphaTest Greater 0.1
    pass
    {
    CGPROGRAM
    // Upgrade NOTE: excluded shader from DX11, Xbox360, OpenGL ES 2.0 because it uses unsized arrays
    #pragma exclude_renderers d3d11 xbox360 gles
    #pragma target 3.0
    #pragma vertex vert
    #pragma fragment frag
    #include "UnityCG.cginc"
    
    
    sampler2D _MainTex;
    float4 _MainTex_ST;
    float _Point1;
    float _Point2;
    float _Point3;
    float _Point4;
    bool computer = false;
    
    
    struct v2f {
    float4 pos:SV_POSITION;
    float2 uv:TEXCOORD0;
    };
    
    v2f vert(appdata_base v)
    {
    v2f o;
    o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
    o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
    return o;
    }
    
    float computerTemperature(float2 uv)
    {
    int plength = 3;
    float _midPointX[3] = {0.2,0.8,0.5};
    float _midPointY[3] = {0.7,0.9,0.4};
    float _midPointT[3] = {10,20,90};
    
    float d1 = sqrt(uv.x*uv.x+uv.y*uv.y);
    float d2 = sqrt((1-uv.x)*(1-uv.x)+(1-uv.y)*(1-uv.y));
    float d3 = sqrt(uv.x*uv.x+(1-uv.y)*(1-uv.y));
    float d4 = sqrt((1-uv.x)*(1-uv.x)+uv.y*uv.y);
    
    
    float m = 1/d1+1/d2+1/d3+1/d4;
    float n = 1/d1*_Point1+1/d2*_Point4+1/d3*_Point3+1/d4*_Point2;
    for (int i = 0 ; i < plength ; i++)
    {
    float dp = sqrt((uv.x-_midPointX)*(uv.x-_midPointX)+(uv.y-_midPointY)*(uv.y-_midPointY));
    
    m = m + 1/dp;
    n = n + 1/dp*_midPointT;
    }
    
    
    return n/m;
    
    }
    
    float4 frag(v2f i):COLOR
    {
    
    float4 outp;
    
    float4 texCol = tex2D(_MainTex,i.uv);
    
    float temp = computerTemperature(i.uv);
    //float temp = computeArray(i.uv);
    
    //图像区域,判定设置为颜色的A > 0.5,输出为材质颜色+光亮值
    if(texCol.w>0.5)
    {
    if(temp >= 60)
    outp = float4(1,0,0,1)*(temp-60)/40+float4(1,1,0,1)*(1-(temp-60)/40);
    else if(temp >= 30)
    outp = float4(1,1,0,1)*(temp-30)/30+float4(0,1,0,1)*(1-(temp-30)/30);
    else
    outp = float4(0,1,0,1)*(temp)/30+float4(0,0,1,1)*(1-(temp)/30);
    }
    else
    outp = float4(0,0,0,0);
    return outp;
    }
    
    ENDCG
    }
    }
    FallBack "Diffuse"
    }

    其中_Point1到4是平面4个顶点上的温度值
    _midPointX,_midPointY,_midPointT给出了平面内三个点的位置和温度值,实际应用中可以相应修改和增删

     
     

    图片:未命名1.jpg

  • 相关阅读:
    c#中==和equals的比较
    原型指向改变如何添加方法和访问
    把随机数对象暴露给window成为全局变量
    内置对象Array的原型对象中添加方法
    构造函数可以实例化对象
    原型
    无刷新评论
    大量字符串拼接案例
    元素隐藏占位与不占位
    导航栏切换效果案例
  • 原文地址:https://www.cnblogs.com/lpcoder/p/7103634.html
Copyright © 2011-2022 走看看