https://t.co/catQRAieGt
— 光属性のアルモジナ(VRChat勢) (@arumogina) July 22, 2019
レイマーチング、HLSLへ移植してみたのだ pic.twitter.com/kMhDwnenxe
Shader "Custom/Ray2-1"{ Properties{ _R("R",Float) = 1 _Loop("Loop",Int) = 5 _CanvasSize("CanvasSize",Vector) = (1,1,1,1) } SubShader{ Tags { "RenderType" = "Opaque" "LightMode" = "ForwardBase" } LOD 100 Cull Off Pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float _R; int _Loop; float4 _CanvasSize; #define OCT 9 #define SHIFT 2.55 #define ITER 96 #define EPS 0.001 #define NEAR 0.1 #define FAR 20. #define SPEED 0.1 float3 mod(float3 a, float3 b){ return frac(abs(a / b)) * abs(b); } float3 rotX(float3 p,float a){return float3(p.x,p.y*cos(a)-p.z*sin(a),p.y*sin(a)+p.z*cos(a));} float3 rotY(float3 p,float a){return float3(p.x*cos(a)-p.z*sin(a),p.y,p.x*sin(a)+p.z*cos(a));} float3 rotZ(float3 p,float a){return float3(p.x*cos(a)-p.y*sin(a), p.x*sin(a)+p.y*cos(a), p.z);} float3 hsv(float h,float s,float v){return ((clamp(abs(frac(h+float3(0.,.666,.333))*6.-3.)-1.,0.,1.)-1.)*s+1.)*v;} float map(float3 p){ float r=1.; p.xz=frac(p.xz)-.5; for(int i=0;i<OCT;i++){ p=abs(p);p.y-=SHIFT; float s=2./clamp(dot(p,p),.28,.99); p*=s; p-=float3(.51,4.,.7); r*=s; } return length(p/r);} float trace(float3 ro,float3 rd,out float n){ float t=NEAR; float d; for(int i=0;i<ITER;i++){ d=map(ro+rd*t); if(abs(d)<EPS||t>FAR) break; t+=step(d,1.)*d*.2+d*.5;n+=1.; } return min(t,FAR); } struct appdata{ float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f{ float2 uv : TEXCOORD0; float3 pos : TEXCOORD1; float4 vertex : SV_POSITION; }; v2f vert(appdata v){ v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.pos =v.vertex.xyz;//メッシュのローカル座標を代入 o.uv = v.uv; return o; } float4 frag(v2f i) : SV_Target{ float2 uv=(i.pos.xy-.5*_CanvasSize.xy)/_CanvasSize.y; float3 rd=float3(uv,-.9); rd=rotX(rd,sin(_Time.y*.1)); rd=rotY(rd,sin(_Time.y*.13)); rd=rotZ(rd,sin(_Time.y*.11)); float c=clamp(sin(_Time.y*.1)*30.,0.,1.); float n=0; float v=1.-trace(float3(sin(_Time.y*.314)*.15,sin(_Time.y*.1)*.6+SHIFT,1.-_Time.y*SPEED),rd,n)/FAR; n /= float(ITER); float3 rhsv = hsv(v*4.-_Time.y*SPEED*5./FAR, 1.0, v); float3 aa = float3(1-c,1-c,1-c); float3 bb = float3(c,c,c); float3 cc = lerp(rhsv,aa,n); float3 ee = lerp(bb,cc,n)*v; return float4(ee,1); } ENDCG }//pass }//subshader }