- Home /
Raymarching - bad shadows/light quality on fractals
Hello, i am experimenting with some raymarching shaders & fractals, but i my shadow/light quality is really bad on my fractals, but on sphere/any other objects it works completly fine, any ideas?
My code here:
Shader "Ondy/RayMarch"
{
Properties
{
_mainColor ("MainColor", Color) = (.25, .5, .5, 1)
_MainTex ("Texture", 2D) = "white" {}
ScaleX ("ScaleX", Float) = 1
ScaleY ("ScaleY", Float) = 1
ScaleZ ("ScaleZ", Float) = 1
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Cull off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
#include "DistanceFunctions.cginc"
uniform fixed4 _mainColor;
uniform float ScaleX;
uniform float ScaleY;
uniform float ScaleZ;
uniform float3 _LightDir;
#define MAX_STEPS 164
#define MAX_DIST 150
#define SURF_DIST 1e-4
#define _LightDir (1, 1, 1)
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 ro : TEXCOORD1;
float3 hitPos : TEXCOORD2;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.ro = _WorldSpaceCameraPos;
o.hitPos = mul(unity_ObjectToWorld, v.vertex);
return o;
}
float GetDist(float3 p)
{
float d = sdBox(p - 2,float3(1, 1, 1));
//float3 res = float4( d, 1.0, 0.0, 0.0 );
float xd = sdSphere(p, float3(1, 1, 1));
float s = 1.0;
for( int m=0; m<4; m++ )
{
float3 a = fmod( p * s, 2.0 ) - 1;
s *= 3.0;
float3 r = abs(1.0 - 3 * abs(a));
float da = max(r.x,r.y);
float db = max(r.y,r.z);
float dc = max(r.z,r.x);
float c = (min(da,min(db,dc))-1)/s;
d = max(d,c);
//if( c > d )
//{
// d = c;
// res = float4( d, 0.2*da*db*dc, (1.0+float(m))/4.0, 0.0 );
//}
}
//return res;
return float3(d, 1, 1);
}
float Raymarch(float3 ro, float3 rd)
{
float dO = 0;
float dS;
for(int i = 0; i < MAX_STEPS; i++)
{
float3 p = ro + dO * rd;
dS = GetDist(p);
dO += dS;
if (dS<SURF_DIST || dO>MAX_DIST) break;
}
return dO;
}
float3 GetNormal(float3 p)
{
const float2 e = float2(1e-2, 0);
float3 n = float3(
GetDist(p + e.xyy) - GetDist(p - e.xyy),
GetDist(p + e.yxy) - GetDist(p - e.yxy),
GetDist(p + e.yyx) - GetDist(p - e.yyx)
);
return normalize(n);
}
fixed4 frag (v2f i) : SV_Target
{
float2 uv = i.uv-.5;
float3 ro = i.ro; //float3(0, 0, -3);
float3 rd = normalize(i.hitPos-ro); //normalize(float3(uv.x, uv.y, 1));
float d = Raymarch(ro, rd);
fixed4 col = 0;
if(d >= MAX_DIST){
//discard;
}
else{
float3 p = ro + rd * d;
float3 n = GetNormal(p);
float light = dot(-_LightDir, n);
//col.rgb = n *+- light;
col.rgb = light * _mainColor;
}
//if(d < MAX_DIST){
// float3 p = ro + rd * d;
// float3 n = GetNormal(p);
// col.rgb = n;
// //col.rgb = _mainColor;
//}
return col;
}
ENDCG
}
}
}
fractal.png
(482.2 kB)
sphere.png
(55.3 kB)
Comment
Your answer
Follow this Question
Related Questions
Scene lights flickering 0 Answers
Toon shader light culling shadow issue 0 Answers
How do I make edges in shadow more distinct? 0 Answers
World ambient Light Binding problem 0 Answers
How to access all the lights in a scene in custom shader? 0 Answers