random trace tweaks
This commit is contained in:
+6
-5
@@ -491,9 +491,10 @@ impl SSATape {
|
||||
.begin_function(
|
||||
float,
|
||||
if with_module { Some(1000) } else { None },
|
||||
spirv::FunctionControl::DONT_INLINE
|
||||
| spirv::FunctionControl::PURE
|
||||
| spirv::FunctionControl::CONST,
|
||||
//spirv::FunctionControl::DONT_INLINE
|
||||
spirv::FunctionControl::INLINE
|
||||
| spirv::FunctionControl::PURE
|
||||
| spirv::FunctionControl::CONST,
|
||||
point_fn_type,
|
||||
)
|
||||
.unwrap();
|
||||
@@ -1285,7 +1286,7 @@ impl SSATape {
|
||||
b.end_function().unwrap();
|
||||
}
|
||||
|
||||
{
|
||||
/*{
|
||||
let _scene = b
|
||||
.begin_function(
|
||||
vec2,
|
||||
@@ -2819,7 +2820,7 @@ impl SSATape {
|
||||
}
|
||||
}
|
||||
b.end_function().unwrap();
|
||||
}
|
||||
}*/
|
||||
|
||||
let module = b.module();
|
||||
|
||||
|
||||
+15
-33
@@ -1,5 +1,3 @@
|
||||
// global fragment shader
|
||||
|
||||
#version 460
|
||||
#extension GL_GOOGLE_include_directive:require
|
||||
#include "include.glsl"
|
||||
@@ -12,41 +10,25 @@ layout(depth_greater) out float gl_FragDepth;
|
||||
layout(location = 0) out uint material;
|
||||
|
||||
const float EPSILON = .001;
|
||||
const uint MAX_STEPS = 50;
|
||||
const float NEARPLANE = 0.;
|
||||
float FARPLANE = length(object_uniforms.dimensions / 32.);
|
||||
|
||||
vec2 spheretracing(vec3 ori, vec3 dir, out vec3 p) {
|
||||
vec2 td = vec2(NEARPLANE, 1.);
|
||||
p = ori;
|
||||
td.y = scene(vec4(p, camera_uniforms.campos_and_time.w)) * .98;
|
||||
td.x += td.y;
|
||||
p = fma(dir, vec3(td.x), ori);
|
||||
for (int i = 0; td.y > EPSILON && td.x < FARPLANE; i++) {
|
||||
td.y = scene(vec4(p, camera_uniforms.campos_and_time.w)) * .98;
|
||||
td.x += td.y;
|
||||
p = fma(dir, vec3(td.x), ori);
|
||||
}
|
||||
return td;
|
||||
}
|
||||
|
||||
//Implicit Surface Entrypoint
|
||||
void main() {
|
||||
vec3 raypos = pos.xyz;
|
||||
|
||||
vec3 p;
|
||||
vec3 raydir = normalize(raypos - (pc.inv_world * vec4(camera_uniforms.campos_and_time.xyz, 1)).xyz);
|
||||
|
||||
vec2 td = spheretracing(raypos, raydir, p);
|
||||
|
||||
if (td.y < EPSILON)
|
||||
{
|
||||
vec4 tpoint = camera_uniforms.proj_view * pc.world * vec4(p, 1);
|
||||
gl_FragDepth = (tpoint.z / tpoint.w);
|
||||
material = object_uniforms.material;
|
||||
}
|
||||
else
|
||||
{
|
||||
discard;
|
||||
}
|
||||
vec3 p = raypos;
|
||||
float total_dist = 0.;
|
||||
do {
|
||||
float dist = scene(vec4(p, camera_uniforms.campos_and_time.w)) * .98;
|
||||
total_dist += dist;
|
||||
p = fma(raydir, vec3(total_dist), raypos);
|
||||
if (dist < EPSILON) {
|
||||
vec4 tpoint = camera_uniforms.proj_view * pc.world * vec4(p, 1);
|
||||
gl_FragDepth = (tpoint.z / tpoint.w);
|
||||
material = object_uniforms.material;
|
||||
return;
|
||||
} else if (total_dist > FARPLANE) {
|
||||
discard;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user