This commit is contained in:
Lubos Lenco 2017-06-06 18:29:33 +02:00
parent 1252b87383
commit fc27d9afc1
9 changed files with 181 additions and 5 deletions

View file

@ -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));

View file

@ -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
View 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));
}

View file

@ -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

View file

@ -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')

View file

@ -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'),

View file

@ -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")

View file

@ -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