unity3d学习之温度云图(温场)实现
基本原理是给定平面上的几个点的位置和该点的温度信息,然后通过距离比的关系来算
出平面上任意点的温度数值,再通过颜色反映出来。 1. Shader "Custom/TemperatureField" { 2. Properties {
3. _MainTex ("Base (RGB)", 2D) = "white" {} 4. _Point1("Temperature1",Range(0,100)) = 50 5. _Point2("Temperature2",Range(0,100)) = 50 6. _Point3("Temperature3",Range(0,100)) = 50 7. _Point4("Temperature4",Range(0,100)) = 50 8. }
9. SubShader {
10. AlphaTest Greater 0.1
11. pass
12. {
13. CGPROGRAM
14. // Upgrade NOTE: excluded shader from DX11, Xbox360, OpenGL ES 2.0
because it uses unsized arrays
15. #pragma exclude_renderers d3d11 xbox360 gles 16. #pragma target 3.0
17. #pragma vertex vert
18. #pragma fragment frag
19. #include "UnityCG.cginc"
20.
21.
22. sampler2D _MainTex; 23. float4 _MainTex_ST; 24. float _Point1;
25. float _Point2;
26. float _Point3;
27. float _Point4;
28. bool computer = false; 29.
30.
31. struct v2f {
32. float4 pos:SV_POSITION; 33. float2 uv:TEXCOORD0; 34. };
35.
36. v2f vert(appdata_base v) 37. {
38. v2f o;
39. o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
40. o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
41. return o;
42. }
43.
44. float computerTemperature(float2 uv)
45. {
46. int plength = 3;
47. float _midPointX[3] = {0.2,0.8,0.5}; 48. float _midPointY[3] = {0.7,0.9,0.4}; 49. float _midPointT[3] = {10,20,90}; 50.
51. float d1 = sqrt(uv.x*uv.x+uv.y*uv.y); 52. float d2 = sqrt((1-uv.x)*(1-uv.x)+(1-uv.y)*(1-uv.y)); 53. float d3 = sqrt(uv.x*uv.x+(1-uv.y)*(1-uv.y)); 54. float d4 = sqrt((1-uv.x)*(1-uv.x)+uv.y*uv.y); 55.
56.
57. float m = 1/d1+1/d2+1/d3+1/d4; 58. float n = 1/d1*_Point1+1/d2*_Point4+1/d3*_Point3+1/d4*_Point2;
59. for (int i = 0 ; i < plength ; i++)
60. {
61. float dp =
sqrt((uv.x-_midPointX)*(uv.x-_midPointX)+(uv.y-_midPointY)*(uv.y-_midPointY))
;
62.
63. m = m + 1/dp;
64. n = n + 1/dp*_midPointT;
65. }
66.
67.
68. return n/m;
69.
70. }
71.
72. float4 frag(v2f i):COLOR
73. {
74.
75. float4 outp;
76.
77. float4 texCol = tex2D(_MainTex,i.uv);
78.
79. float temp = computerTemperature(i.uv); 80. //float temp = computeArray(i.uv);
81.
82. //图像区域,判定设置为颜色的A > 0.5,输出为材质颜色+光亮值 83. if(texCol.w>0.5)
84. {
85. if(temp >= 60)
86. outp = float4(1,0,0,1)*(temp-60)/40+float4(1,1,0,1)*(1-(temp-60)/40);
87. else if(temp >= 30)
88. outp = float4(1,1,0,1)*(temp-30)/30+float4(0,1,0,1)*(1-(temp-30)/30);
89. else
90. outp = float4(0,1,0,1)*(temp)/30+float4(0,0,1,1)*(1-(temp)/30); 91. }
92. else
93. outp = float4(0,0,0,0);
94. return outp;
95. }
96.
97. ENDCG
98. }
99. }
100. FallBack "Diffuse"
101. }
复制代码
其中_Point1到4是平面4个顶点上的温度值 _midPointX,_midPointY,_midPointT
给出了平面内三个点的位置和温度值,实际应用中可以相应修改和增删
文章来着【狗刨学习网】