游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3289|回复: 0

???Unity????????

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2020-3-23 15:05:12 | 显示全部楼层 |阅读模式
?????????????????

1.?????????

2.??????? ???????3D??2D ??????

3.???????????????????Y???

???Unity Connect??????????????????Unity??????????

?????

1.png

?????????????? z(i,j,k+1) ? ????+?????+????

???? *= (4-8*c^2*t^2/d^2/d^2)/(u*t)

????? *= (ut-2) / (ut + 2)

???? *= (2c^2t^2/d^2) / (ut + 2)

???????? c ??? u ??, d ??????, t ?????

???????????

????????????Unity Wiki?????????????wiki???????????

https://wiki.unity3d.com/index.php/CreatePlane

2.png

???????????10???10????100??????????????????????????????????3???????????????????

  1. m_waterWaveMarkTexture = new RenderTexture(WaveTextureResolution, WaveTextureResolution, 0, RenderTextureFormat.Default);
  2.         m_waterWaveMarkTexture.name = "m_waterWaveMarkTexture";
  3.         m_waveTransmitTexture = new RenderTexture(WaveTextureResolution, WaveTextureResolution, 0, RenderTextureFormat.Default);
  4.         m_waveTransmitTexture.name = "m_waveTransmitTexture";
  5.         m_prevWaveMarkTexture = new RenderTexture(WaveTextureResolution, WaveTextureResolution, 0, RenderTextureFormat.Default);
  6.         m_prevWaveMarkTexture.name = "m_prevWaveMarkTexture";
复制代码

????????

  1. void WaterPlaneCollider()
  2.     {
  3.         hasHit = false;
  4. if (Input.GetMouseButton(0))
  5.         {
  6.             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  7.             RaycastHit hitInfo = new RaycastHit();
  8. bool ret = Physics.Raycast(ray.origin, ray.direction, out hitInfo);
  9. if (ret)
  10.             {
  11.                 Vector3 waterPlaneSpacePos = WaterPlane.transform.worldToLocalMatrix * new Vector4(hitInfo.point.x, hitInfo.point.y, hitInfo.point.z, 1);

  12. float dx = (waterPlaneSpacePos.x / WaterPlaneWidth) + 0.5f;
  13. float dy = (waterPlaneSpacePos.z / WaterPlaneLength) + 0.5f;

  14.                 hitPos.Set(dx, dy);
  15.                 m_waveMarkParams.Set(dx, dy, WaveRadius * WaveRadius, WaveHeight);

  16.                 hasHit = true;
  17.             }
  18.         }
  19.     }
复制代码

??????Raycast ??????????????????????? [0-1] ??????????uv?????? m_waterWaveMarkTexture ????? ???????? world2Local ???????? ???CreatePlane?????Pivot ?????????????1????????[-0.5,0.5]????????? + 0.5???

??????Shader

  1. float dx = i.uv.x - _WaveMarkParams.x;
  2. float dy = i.uv.y - _WaveMarkParams.y;

  3. float disSqr = dx * dx + dy * dy;

  4. int hasCol = step(0, _WaveMarkParams.z - disSqr);

  5. float waveValue = DecodeHeight(tex2D(_MainTex, i.uv));

  6. if (hasCol == 1) {
  7. waveValue = _WaveMarkParams.w;
  8.                 }
复制代码

?????_WaveMarkParams.xy ???uv ?????????????????????

????Shader

  1. static const float2 WAVE_DIR[4] = { float2(1, 0), float2(0, 1), float2(-1, 0), float2(0, -1) };

  2. float dx = _WaveTransmitParams.w;

  3. float avgWaveHeight = 0;
  4. for (int s = 0; s < 4; s++)
  5.                 {
  6.                     avgWaveHeight += DecodeHeight(tex2D(_MainTex, i.uv + WAVE_DIR[s] * dx));
  7.                 }

  8. //(2 * c^2 * t^2 / d ^2) / (u * t + 2)*(z(x + dx, y, t) + z(x - dx, y, t) + z(x, y + dy, t) + z(x, y - dy, t);
  9. float agWave = _WaveTransmitParams.z * avgWaveHeight;

  10. // (4 - 8 * c^2 * t^2 / d^2) / (u * t + 2)
  11. float curWave = _WaveTransmitParams.x *  DecodeHeight(tex2D(_MainTex, i.uv));
  12. // (u * t - 2) / (u * t + 2) * z(x,y,z, t - dt) ?????? t - dt
  13. float prevWave = _WaveTransmitParams.y * DecodeHeight(tex2D(_PrevWaveMarkTex, i.uv));

  14. //???
  15. float waveValue = (curWave + prevWave + agWave) * _WaveAtten;
复制代码

????????????????????????????ES3.0 ???

  1. v2f vert (appdata v)
  2. {
  3. v2f o;

  4. float4 localPos = v.vertex;
  5. float4 waveTransmit = tex2Dlod(_WaveResult, float4(v.uv, 0, 0));
  6. float waveHeight = DecodeFloatRGBA(waveTransmit);

  7. localPos.y += waveHeight * _WaveScale;

  8. float3 worldPos = mul(unity_ObjectToWorld, localPos);
  9. float3 worldSpaceNormal = mul(unity_ObjectToWorld, v.normal);
  10. float3 worldSpaceViewDir = UnityWorldSpaceViewDir(worldPos);

  11. o.vertex = mul(UNITY_MATRIX_VP, float4(worldPos, 1));
  12. o.uv = v.uv;
  13. o.worldSpaceReflect = reflect(-worldSpaceViewDir, worldSpaceNormal);
  14. return o;
复制代码

* ????????????

https://en.wikipedia.org/wiki/Wave_equation

https://www.amazon.com/Mathematics-Programming-Computer-Graphics-Third/dp/1435458869 ?? ??

???dreamfairy  
???Unity????
????https://mp.weixin.qq.com/s/-sL54xgyX6mVMnVOMHnpVg

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-10-29 12:33

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表