More sdf
This commit is contained in:
parent
1252b87383
commit
fc27d9afc1
|
@ -20,6 +20,9 @@ precision mediump float;
|
|||
#include "../std/shadows.glsl"
|
||||
#endif
|
||||
#endif
|
||||
#ifdef _DFRS
|
||||
#include "../std/sdf.glsl"
|
||||
#endif
|
||||
#ifdef _SSS
|
||||
#include "../std/sss.glsl"
|
||||
#endif
|
||||
|
@ -42,6 +45,9 @@ uniform sampler2D gbuffer1;
|
|||
//!uniform float lampSizeUV;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef _DFRS
|
||||
//!uniform sampler2D sdftex;
|
||||
#endif
|
||||
|
||||
uniform mat4 invVP;
|
||||
uniform mat4 LWVP;
|
||||
|
@ -170,6 +176,72 @@ void main() {
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef _DFRS
|
||||
|
||||
const float distmax = 40.0;
|
||||
const float eps = 0.02;
|
||||
const int maxSteps = 30;
|
||||
float dist = 0.1;
|
||||
|
||||
// float test = mapsdf2(p);
|
||||
// if (test < 0.1) {
|
||||
// fragColor = vec4(1.0, 0.0, 0.0, 1.0);
|
||||
// return;
|
||||
// }
|
||||
|
||||
float lastd = distmax;
|
||||
for (int i = 0; i < maxSteps; i++) {
|
||||
vec3 rd = l * dist;
|
||||
float d = sdBox(p + rd, vec3(1.0));
|
||||
|
||||
// Going out of volume box
|
||||
// if (d > 0.0 && lastd < d) {
|
||||
// break;
|
||||
// }
|
||||
// lastd = d;
|
||||
|
||||
if (d <= 0.0) { // In volume
|
||||
d = mapsdf(p, rd);
|
||||
|
||||
if (d < eps) {
|
||||
visibility = 0.0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else { // To volume
|
||||
// d += mapsdf(p, rd);
|
||||
|
||||
vec3 sampleBorder = clamp(p + rd, vec3(-1.0), vec3(1.0));
|
||||
float phi = mapsdf2(sampleBorder, rd);
|
||||
float dd = 0.1;
|
||||
float grad_x = mapsdf2(sampleBorder + vec3(dd, 0, 0), rd) - phi;
|
||||
float grad_y = mapsdf2(sampleBorder + vec3(0, dd, 0), rd) - phi;
|
||||
vec3 grad = vec3(grad_x, grad_y, 1.0);
|
||||
vec3 endpoint = sampleBorder - normalize(grad) * phi;
|
||||
d = distance(endpoint, p + rd);
|
||||
|
||||
// float dd = 0.1;
|
||||
// vec3 p0 = clamp(p, vec3(-1.0), vec3(1.0));
|
||||
// vec3 p1 = clamp(p, vec3(-0.99), vec3(0.99));
|
||||
// float r0 = mapsdf2(p0, rd);
|
||||
// float r1 = mapsdf2(p1, rd);
|
||||
// float h0 = 0.5 + (r0 * r0 - r1 * r1) / (2.0 * dd * dd);
|
||||
// float ri = sqrt(abs(r0 * r0 - h0 * h0 * dd * dd));
|
||||
// vec3 p2 = p0 + (p1 - p0) * h0;
|
||||
// vec3 p3 = p2 + vec3(p1.z - p0.z, p1.y - p0.y, p1.x - p0.x) * ri;
|
||||
// d = length((p + rd) - p3);
|
||||
}
|
||||
|
||||
const float k = 2.0;
|
||||
visibility = min(visibility, (k * d / dist));
|
||||
dist += d;
|
||||
|
||||
if (dist > distmax) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Per-light
|
||||
#ifndef _NoLampFalloff
|
||||
visibility *= attenuate(distance(p, lightPos));
|
||||
|
|
|
@ -110,6 +110,11 @@
|
|||
"name": "VP",
|
||||
"link": "_viewProjectionMatrix",
|
||||
"ifdef": ["_SSRS"]
|
||||
},
|
||||
{
|
||||
"name": "sdftex",
|
||||
"link": "_sdfTexture",
|
||||
"ifdef": ["_DFRS"]
|
||||
}
|
||||
],
|
||||
"vertex_shader": "deferred_light.vert.glsl",
|
||||
|
|
47
Shaders/std/sdf.glsl
Normal file
47
Shaders/std/sdf.glsl
Normal file
|
@ -0,0 +1,47 @@
|
|||
const float res = 50.0; // sdftex res
|
||||
|
||||
uniform sampler2D sdftex;
|
||||
|
||||
float mapsdf(vec3 ro, vec3 rd) {
|
||||
vec3 p = ro + rd;
|
||||
p = clamp(p, vec3(-1.0), vec3(1.0));
|
||||
p = p * 0.5 + 0.5;
|
||||
float s1 = (p.z * res);
|
||||
float s2 = int(s1);
|
||||
float s = s2 - s1;
|
||||
|
||||
float m = sign(rd.z) > 0.0 ? s : (1.0 - s);
|
||||
vec2 co = vec2(p.x / res + s2 / res, p.y);
|
||||
float dist = (texture(sdftex, co).r) * m;
|
||||
|
||||
co.x += 1 / res * sign(rd.z);
|
||||
dist += (texture(sdftex, co).r) * (1.0 - m);
|
||||
|
||||
return dist;
|
||||
}
|
||||
|
||||
float mapsdf2(vec3 p, vec3 rd) {
|
||||
// p = p * 0.5 + 0.5;
|
||||
// float s = int(p.z * res);
|
||||
// vec2 co = vec2(p.x / res + s / res, p.y);
|
||||
// return texture(sdftex, co).r;
|
||||
|
||||
p = p * 0.5 + 0.5;
|
||||
float s1 = (p.z * res);
|
||||
float s2 = int(s1);
|
||||
float s = s2 - s1;
|
||||
|
||||
float m = sign(rd.z) > 0.0 ? s : (1.0 - s);
|
||||
vec2 co = vec2(p.x / res + s2 / res, p.y);
|
||||
float dist = texture(sdftex, co).r * m;
|
||||
|
||||
co.x += 1 / res * sign(rd.z);
|
||||
dist += (texture(sdftex, co).r) * (1.0 - m);
|
||||
|
||||
return dist;
|
||||
}
|
||||
|
||||
float sdBox(vec3 p, vec3 b) {
|
||||
vec3 d = abs(p) - b;
|
||||
return min(max(d.x, max(d.y, d.z)), 0.0) + length(max(d, 0.0));
|
||||
}
|
|
@ -1784,6 +1784,9 @@ class ArmoryExporter:
|
|||
if ArmoryExporter.option_mesh_per_file:
|
||||
fp = self.get_meshes_file_path('mesh_' + oid, compressed=self.is_compress(bobject.data))
|
||||
assets.add(fp)
|
||||
if bobject.data.sdfgen:
|
||||
sdf_path = fp.replace('/mesh_', '/sdf_')
|
||||
assets.add(sdf_path)
|
||||
if self.object_is_mesh_cached(bobject) == True and os.path.exists(fp):
|
||||
return
|
||||
|
||||
|
|
|
@ -95,6 +95,12 @@ def build_node_tree(world):
|
|||
assets.add_khafile_def('arm_no_shadows')
|
||||
if cam.rp_voxelgi:
|
||||
voxelgi = True
|
||||
if cam.rp_dfrs:
|
||||
wrd.world_defs += '_DFRS'
|
||||
assets.add_khafile_def('arm_sdf')
|
||||
if cam.rp_dfao:
|
||||
wrd.world_defs += '_DFAO'
|
||||
assets.add_khafile_def('arm_sdf')
|
||||
|
||||
if voxelgi:
|
||||
assets.add_khafile_def('arm_voxelgi')
|
||||
|
|
|
@ -246,7 +246,7 @@ def init_properties():
|
|||
bpy.types.Mesh.mesh_aabb = bpy.props.FloatVectorProperty(name="AABB", size=3, default=[0,0,0])
|
||||
bpy.types.Mesh.dynamic_usage = bpy.props.BoolProperty(name="Dynamic Usage", description="Mesh data can change at runtime", default=False)
|
||||
bpy.types.Mesh.data_compressed = bpy.props.BoolProperty(name="Compress Data", description="Pack data into zip file", default=False)
|
||||
bpy.types.Mesh.sdfgen = bpy.props.BoolProperty(name="Generate SDF", description="Make signed distance field data", default=False)
|
||||
bpy.types.Mesh.sdfgen = bpy.props.BoolProperty(name="Generate SDF", description="Make signed distance field data", default=False, update=invalidate_mesh_cache)
|
||||
bpy.types.Curve.mesh_cached = bpy.props.BoolProperty(name="Mesh Cached", description="No need to reexport curve data", default=False)
|
||||
bpy.types.Curve.data_compressed = bpy.props.BoolProperty(name="Compress Data", description="Pack data into zip file", default=False)
|
||||
bpy.types.Curve.dynamic_usage = bpy.props.BoolProperty(name="Dynamic Data Usage", description="Curve data can change at runtime", default=False)
|
||||
|
@ -282,6 +282,7 @@ def init_properties():
|
|||
bpy.types.Camera.rp_preset = EnumProperty(
|
||||
items=[('Low', 'Low', 'Low'),
|
||||
('VR Low', 'VR Low', 'VR Low'),
|
||||
('Mobile Low', 'Mobile Low', 'Mobile Low'),
|
||||
('Forward', 'Forward', 'Forward'),
|
||||
('Deferred', 'Deferred', 'Deferred'),
|
||||
('Deferred Plus', 'Deferred Plus (experimental)', 'Deferred Plus'),
|
||||
|
@ -333,7 +334,7 @@ def init_properties():
|
|||
bpy.types.Camera.rp_ssao = bpy.props.BoolProperty(name="SSAO", description="Screen space ambient occlusion", default=True, update=update_renderpath)
|
||||
bpy.types.Camera.rp_ssr = bpy.props.BoolProperty(name="SSR", description="Screen space reflections", default=False, update=update_renderpath)
|
||||
bpy.types.Camera.rp_dfao = bpy.props.BoolProperty(name="DFAO", description="Distance field ambient occlusion", default=False)
|
||||
bpy.types.Camera.rp_dfss = bpy.props.BoolProperty(name="DFSS", description="Distance field soft shadows", default=False)
|
||||
bpy.types.Camera.rp_dfrs = bpy.props.BoolProperty(name="DFRS", description="Distance field ray-traced shadows", default=False)
|
||||
bpy.types.Camera.rp_bloom = bpy.props.BoolProperty(name="Bloom", description="Bloom processing", default=False, update=update_renderpath)
|
||||
bpy.types.Camera.rp_motionblur = EnumProperty(
|
||||
items=[('None', 'None', 'None'),
|
||||
|
|
|
@ -40,6 +40,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = False
|
||||
cam.rp_ssr = False
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Forward':
|
||||
|
@ -64,6 +66,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = True
|
||||
cam.rp_ssr = True
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Deferred':
|
||||
|
@ -87,6 +91,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = True
|
||||
cam.rp_ssr = False
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Max':
|
||||
|
@ -110,6 +116,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = True
|
||||
cam.rp_ssr = True
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Render Capture':
|
||||
|
@ -136,6 +144,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = True
|
||||
cam.rp_ssr = True
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = True
|
||||
cam.rp_motionblur = 'None'
|
||||
wrd.lighting_model = 'Cycles'
|
||||
|
@ -161,6 +171,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = True
|
||||
cam.rp_ssr = True
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'VR Low':
|
||||
|
@ -185,6 +197,34 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = False
|
||||
cam.rp_ssr = False
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Mobile Low':
|
||||
cam.rp_renderer = 'Forward'
|
||||
cam.rp_materials = 'Restricted'
|
||||
cam.rp_shadowmap = '1024'
|
||||
cam.rp_meshes = True
|
||||
cam.rp_translucency_state = 'Off'
|
||||
cam.rp_overlays_state = 'Off'
|
||||
cam.rp_decals_state = 'Off'
|
||||
cam.rp_sss_state = 'Off'
|
||||
cam.rp_hdr = False
|
||||
cam.rp_worldnodes = False
|
||||
cam.rp_clearbackground = True
|
||||
cam.rp_stereo = False
|
||||
cam.rp_greasepencil = False
|
||||
cam.rp_voxelgi = False
|
||||
cam.rp_render_to_texture = False
|
||||
cam.rp_supersampling = '1'
|
||||
cam.rp_antialiasing = 'None'
|
||||
cam.rp_compositornodes = False
|
||||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = False
|
||||
cam.rp_ssr = False
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
elif preset == 'Grease Pencil':
|
||||
|
@ -208,6 +248,8 @@ def set_preset(self, context, preset):
|
|||
cam.rp_volumetriclight = False
|
||||
cam.rp_ssao = False
|
||||
cam.rp_ssr = False
|
||||
cam.rp_dfrs = False
|
||||
cam.rp_dfao = False
|
||||
cam.rp_bloom = False
|
||||
cam.rp_motionblur = 'None'
|
||||
|
||||
|
@ -290,7 +332,7 @@ class GenRPDataPropsPanel(bpy.types.Panel):
|
|||
layout.prop(dat, "rp_ssao")
|
||||
layout.prop(dat, "rp_ssr")
|
||||
layout.prop(dat, "rp_dfao")
|
||||
layout.prop(dat, "rp_dfss")
|
||||
layout.prop(dat, "rp_dfrs")
|
||||
layout.prop(dat, "rp_bloom")
|
||||
layout.prop(dat, "rp_motionblur")
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
{
|
||||
"command": "set_target",
|
||||
"params": [
|
||||
1.0, "sdf"
|
||||
"1.0", "sdf"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue