イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

shader レイマーチングーGLSLtoHLSL1

 

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
}