libgarbage: fix depth of sky, allow limiting depth to mesh, add step multiplier setting
This commit is contained in:
parent
86a3bad992
commit
a1030ca528
1 changed files with 24 additions and 4 deletions
|
@ -19,6 +19,9 @@
|
|||
# don't write depth (will have the depth defined by the original mesh)
|
||||
DISABLE_DEPTH
|
||||
|
||||
# meant for frontface culled meshes, makes depth no further than the mesh edges
|
||||
LIMIT_DEPTH_TO_MESH
|
||||
|
||||
START_RAYS_IN_BOX // TODO: implement
|
||||
START_RAYS_IN_SPHERE // TODO: implement
|
||||
*/
|
||||
|
@ -43,6 +46,11 @@ START_RAYS_IN_SPHERE // TODO: implement
|
|||
#define LIGHT_FN default_lighting
|
||||
#endif
|
||||
|
||||
// set to less than one if there are artifacts in distorted sdfs
|
||||
#ifndef STEP_MULTIPLIER
|
||||
#define STEP_MULTIPLIER 1
|
||||
#endif
|
||||
|
||||
// max ray steps, from last bounce (reset on each reflection)
|
||||
#ifndef MAX_STEPS
|
||||
#define MAX_STEPS 128
|
||||
|
@ -156,16 +164,22 @@ FragOut frag (V2F i) {
|
|||
float prev_gloss = 0;
|
||||
float3 first_hit;
|
||||
|
||||
for (int ray_num = 0; ray_num < REFLECTIONS + 1; ray_num++) {
|
||||
int ray_num = 0;
|
||||
for (; ray_num < REFLECTIONS + 1;) {
|
||||
ray = cast_ray(ray_origin, ray_dir);
|
||||
if (ray_num == 0) { // before any bounces
|
||||
col = LIGHT_FN(ray);
|
||||
first_hit = ray.hit_pos;
|
||||
if (ray.steps == 0) {
|
||||
// discard;
|
||||
// TODO: sky fn
|
||||
}
|
||||
} else {
|
||||
float col_amount = color_used + ((1 - prev_gloss) * (1 - color_used));
|
||||
col = lerp(LIGHT_FN(ray), col, col_amount);
|
||||
color_used = col_amount;
|
||||
}
|
||||
ray_num++;
|
||||
if (ray.missed || ray.mat.gloss < 0.01) {
|
||||
break;
|
||||
}
|
||||
|
@ -175,7 +189,7 @@ FragOut frag (V2F i) {
|
|||
}
|
||||
|
||||
#ifdef DISCARD_ON_MISS
|
||||
if (ray.missed && ray_num == 0) discard;
|
||||
if (ray.missed && ray_num == 1) discard;
|
||||
#endif
|
||||
|
||||
FragOut o;
|
||||
|
@ -183,8 +197,14 @@ FragOut frag (V2F i) {
|
|||
|
||||
#ifndef DISABLE_DEPTH
|
||||
float3 depth_point = first_hit * SCENE_SCALE;
|
||||
if (ray.missed && ray_num == 0)
|
||||
if (ray.missed && ray_num == 1)
|
||||
depth_point = i.hit_pos;
|
||||
|
||||
#ifdef LIMIT_DEPTH_TO_MESH
|
||||
if (length(ray.start - ray.hit_pos) > length(i.cam_pos - i.hit_pos))
|
||||
depth_point = i.hit_pos;
|
||||
#endif
|
||||
|
||||
#ifdef USE_WORLD_SPACE
|
||||
float4 clip_pos = mul(UNITY_MATRIX_VP, float4(depth_point, 1));
|
||||
#else
|
||||
|
@ -225,7 +245,7 @@ Ray cast_ray(float3 start, float3 dir, float start_len) {
|
|||
break;
|
||||
}
|
||||
ray.min_dist = min(ray.min_dist, ray.dist);
|
||||
ray_len += ray.dist;
|
||||
ray_len += ray.dist * STEP_MULTIPLIER;
|
||||
if (ray_len > MAX_DIST) break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue