当前位置:   article > 正文

substance designer中的warp节点分析_direction warp

direction warp

一直觉得warp挺适用,但是用起来有时候效果挺奇怪的

还有directional warp貌似两个产生的效果截然不同

于是尝试用u3d 材质实现下


directional warp

这个节点主要功能是用灰度信息推开像素,常常用来分割连续贴图,用于让砖块之类纹理看起来更不连续

根据灰度扭曲图像,所以有方向性,灰度决定扭曲的距离



warp

用高度图来扭曲图像做边缘破损效果,因为对坡度变化越大的地方效果越剧烈,没有坡度的地方没有效果


有检测边缘的效果,棋盘格输入,只能扭曲棋盘格构成的线框,而且无法改变本身
用有渐变的高度图像作为输入,那么根据图像梯度进行扭曲,就是渐变剧烈的地方扭曲,颜色本身不能决定扭曲程度


下面是substance designer中两个对比图

可以看到上面区块明显有位移了

下面的只是有细线,扭曲数值都调大了

先可以模拟direction warp 也可以看到其实这个运算比warp快,这个就是材质中常用的uv扭曲方式

  1. float2 vertex_uv = float2(1.,1.);
  2. float4 displace = tex2D(_MainTex2, i.uv);
  3. float displace_k = displace.r * _Number;
  4. float2 uv_displaced = float2(i.uv.x*displace_k - displace_k/2.0, i.uv.y*displace_k - displace_k / 2.0);
  5. uv_displaced = float2(i.uv.x - displace_k/2.0, i.uv.y - displace_k / 2.0);//direction

可以看到效果基本一样


warp因为有边缘检测 所以略有不同

但是不知道substance designer在里面还有什么处理不能完全还原,只能是大概

下面是用sobel材质改的

只是做了提取扭曲部分的灰度,并没有用第二张图来扭曲

不过可以参考上面的来写

  1. Shader "Custom/test" {
  2. Properties{
  3. _MainTex("MainTex", 2D) = "white" {}
  4. _Size("Size", range(1,2048)) = 256
  5. }
  6. SubShader{
  7. pass {
  8. Tags{ "LightMode" = "ForwardBase" }
  9. Cull off
  10. CGPROGRAM
  11. #pragma vertex vert
  12. #pragma fragment frag
  13. #include "UnityCG.cginc"
  14. float _Size;
  15. sampler2D _MainTex;
  16. float4 _MainTex_ST;
  17. struct v2f {
  18. float4 pos:SV_POSITION;
  19. float2 uv_MainTex:TEXCOORD0;
  20. };
  21. v2f vert(appdata_full v) {
  22. v2f o;
  23. o.pos = UnityObjectToClipPos(v.vertex);
  24. o.uv_MainTex = TRANSFORM_TEX(v.texcoord,_MainTex);
  25. return o;
  26. }
  27. float4 frag(v2f i) :COLOR
  28. {
  29. float mc = tex2D(_MainTex, i.uv_MainTex).r;
  30. float4 c = 0;
  31. float mc00 = tex2D(_MainTex, i.uv_MainTex - fixed2(1, 1) / _Size).r- mc;
  32. float mc10 = tex2D(_MainTex, i.uv_MainTex - fixed2(0, 1) / _Size).r- mc;
  33. float mc20 = tex2D(_MainTex, i.uv_MainTex - fixed2(-1, 1) / _Size).r- mc;
  34. float mc01 = tex2D(_MainTex, i.uv_MainTex - fixed2(1, 0) / _Size).r- mc;
  35. float mc21 = tex2D(_MainTex, i.uv_MainTex - fixed2(-1, 0) / _Size).r- mc;
  36. float mc02 = tex2D(_MainTex, i.uv_MainTex - fixed2(1, -1) / _Size).r- mc;
  37. float mc12 = tex2D(_MainTex, i.uv_MainTex - fixed2(0, -1) / _Size).r- mc;
  38. float mc22 = tex2D(_MainTex, i.uv_MainTex - fixed2(-1, -1) / _Size).r- mc;
  39. if (mc00 != 0.0)c = (c<abs(mc00)) ? abs(mc00) : c;
  40. if (mc10 != 0.0)c = (c<abs(mc10)) ? abs(mc10) : c;
  41. if (mc20 != 0.0)c = (c<abs(mc20)) ? abs(mc20) : c;
  42. if (mc01 != 0.0)c = (c<abs(mc01)) ? abs(mc01) : c;
  43. if (mc21 != 0.0)c = (c<abs(mc21)) ? abs(mc21) : c;
  44. if (mc02 != 0.0)c = (c<abs(mc02)) ? abs(mc02) : c;
  45. if (mc12 != 0.0)c = (c<abs(mc12)) ? abs(mc12) : c;
  46. if (mc22 != 0.0)c = (c<abs(mc22)) ? abs(mc22) : c;
  47. return c;
  48. }
  49. ENDCG
  50. }
  51. }
  52. }




通过对比发现圆形范围不是很正常

网格和其他倒是类似

所以还是需要探索下,估计还有其他算法



本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/265200
推荐阅读
相关标签
  

闽ICP备14008679号