Faster voxels

This commit is contained in:
Lubos Lenco 2017-10-23 16:24:57 +02:00
parent d8d33f32e1
commit 21c89b3eec
16 changed files with 151 additions and 120 deletions

View file

@ -27,10 +27,12 @@ uniform sampler2D gbuffer1;
#ifdef _VoxelGI
//!uniform sampler3D voxels;
uniform vec3 eyeSnap;
#endif
#ifdef _VoxelAO
//!uniform sampler3D voxels;
#endif
#ifdef _VoxelGICam
uniform vec3 eyeSnap;
#endif

View file

@ -37,6 +37,9 @@ precision mediump float;
#ifdef _VoxelGIDirect
//!uniform sampler3D voxels;
#endif
#ifdef _VoxelGICam
uniform vec3 eyeSnap;
#endif
uniform sampler2D gbufferD;
uniform sampler2D gbuffer0;

View file

@ -28,6 +28,9 @@ precision mediump float;
#ifdef _VoxelGIDirect
//!uniform sampler3D voxels;
#endif
#ifdef _VoxelGICam
uniform vec3 eyeSnap;
#endif
uniform sampler2D gbufferD;
uniform sampler2D gbuffer0;

View file

@ -52,6 +52,11 @@
"name": "eye",
"link": "_cameraPosition"
},
{
"name": "eyeSnap",
"link": "_cameraPositionSnap",
"ifdef": ["_VoxelGICam"]
},
{
"name": "eyeLook",
"link": "_cameraLook"

View file

@ -7,8 +7,9 @@
// http://www.seas.upenn.edu/%7Epcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf
// https://research.nvidia.com/sites/default/files/publications/GIVoxels-pg2011-authors.pdf
const float MAX_DISTANCE = 1.73205080757;
const float VOXEL_SIZE = (2.0 / voxelgiResolution.x);
const float MAX_DISTANCE = 1.73205080757 * voxelgiRange;
const float VOXEL_SIZE = (2.0 / voxelgiResolution.x) * voxelgiStep;
const float blendFac = (1.0 / max(voxelgiOcc, 0.1));
uniform sampler3D voxels;
@ -40,7 +41,7 @@ vec3 tangent(const vec3 n) {
// dir.z * textureLod(voxels[indices.z], pos, lod);
// }
vec4 traceCone(const vec3 origin, vec3 dir, float aperture, const float maxDist, const float offset) {
vec4 traceCone(const vec3 origin, vec3 dir, const float aperture, const float maxDist, const float offset) {
dir = normalize(dir);
// uvec3 indices = faceIndices(dir);
vec4 sampleCol = vec4(0.0);
@ -52,12 +53,12 @@ vec4 traceCone(const vec3 origin, vec3 dir, float aperture, const float maxDist,
// Choose mip level based on the diameter of the cone
float mip = max(log2(diam * voxelgiResolution.x), 0);
// vec4 mipSample = sampleVoxel(samplePos, dir, indices, mip);
vec4 mipSample = textureLod(voxels, samplePos * 0.5 + vec3(0.5), mip);
#ifdef _VoxelGIEmission
vec4 mipSample = textureLod(voxels, samplePos * 0.5 + 0.5, mip);
#ifdef _VoxelGIEmission
mipSample.rgb = min(mipSample.rgb * 0.9, vec3(0.9)) + max((mipSample.rgb - 0.9) * 200.0, 0.0); // Higher range to allow emission
#endif
#endif
// Blend mip sample with current sample color
sampleCol += ((1 - sampleCol.a) * mipSample) * (1.0 / max(voxelgiOcc, 0.1));
sampleCol += (1 - sampleCol.a) * mipSample;
dist += max(diam / 2, VOXEL_SIZE); // Step size
diam = dist * aperture;
samplePos = dir * dist + origin;
@ -73,7 +74,7 @@ vec4 traceDiffuse(const vec3 origin, const vec3 normal) {
const vec3 o2 = normalize(cross(o1, normal));
const vec3 c1 = 0.5f * (o1 + o2);
const vec3 c2 = 0.5f * (o1 - o2);
const float offset = 1.5 * VOXEL_SIZE;
const float offset = 1.5 * VOXEL_SIZE * voxelgiOffsetDiff;
// Normal direction
vec4 col = traceCone(origin, normal, aperture, MAX_DISTANCE, offset);
#ifdef _VoxelGICone5
@ -81,7 +82,7 @@ vec4 traceDiffuse(const vec3 origin, const vec3 normal) {
col += traceCone(origin, mix(normal, -o2, angleMix), aperture, MAX_DISTANCE, offset);
col += traceCone(origin, mix(normal, c1, angleMix), aperture, MAX_DISTANCE, offset);
col += traceCone(origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset);
return col / 5.0;
return col / (5.0 * blendFac);
#else
// 4 side cones
col += traceCone(origin, mix(normal, o1, angleMix), aperture, MAX_DISTANCE, offset);
@ -93,12 +94,12 @@ vec4 traceDiffuse(const vec3 origin, const vec3 normal) {
col += traceCone(origin, mix(normal, -c1, angleMix), aperture, MAX_DISTANCE, offset);
col += traceCone(origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset);
col += traceCone(origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE, offset);
return col / 9.0;
return col / (9.0 * blendFac);
#endif
}
float traceShadow(const vec3 origin, const vec3 dir, const float aperture, const float targetDistance) {
const float offset = 2 * VOXEL_SIZE;
const float offset = 2 * VOXEL_SIZE * voxelgiOffsetShadow;
return traceCone(origin, dir, aperture, targetDistance, offset).a;
}
@ -107,7 +108,7 @@ vec3 traceSpecular(const vec3 pos, const vec3 normal, const vec3 viewDir, const
float specularAperture = clamp(tan((3.14159265 / 2) * rough * 0.75), 0.0174533, 3.14159265);
vec3 specularDir = normalize(reflect(-viewDir, normal));
// Clamp to 1 grad and pi, exponent is angle of cone in radians
const float offset = 3 * VOXEL_SIZE;
const float offset = 3 * VOXEL_SIZE * voxelgiOffsetSpec;
return traceCone(pos, specularDir, specularAperture, MAX_DISTANCE, offset).xyz;
}
@ -117,7 +118,7 @@ vec3 traceRefraction(const vec3 pos, const vec3 normal, const vec3 viewDir, cons
vec3 refraction = refract(viewDir, normal, 1.0 / ior);
float rough = max(roughness, 0.03);
float specularAperture = clamp(tan((3.14159265 / 2) * rough), 0.0174533, 3.14159265);
const float offset = 1.5 * VOXEL_SIZE;
const float offset = 1.5 * VOXEL_SIZE * voxelgiOffsetRefract;
return transmittance * traceCone(pos, refraction, specularAperture, MAX_DISTANCE, offset).xyz;
}
@ -146,7 +147,7 @@ float traceAO(const vec3 origin, const vec3 normal) {
const vec3 o2 = normalize(cross(o1, normal));
const vec3 c1 = 0.5f * (o1 + o2);
const vec3 c2 = 0.5f * (o1 - o2);
const float offset = 1.5 * VOXEL_SIZE;
const float offset = 1.5 * VOXEL_SIZE * voxelgiOffsetDiff;
// Normal direction
float col = traceConeAO(origin, normal, aperture, MAX_DISTANCE, offset);
// 4 side cones
@ -160,5 +161,5 @@ float traceAO(const vec3 origin, const vec3 normal) {
// col += traceConeAO(origin, mix(normal, c2, angleMix), aperture, MAX_DISTANCE, offset);
col += traceConeAO(origin, mix(normal, -c2, angleMix), aperture, MAX_DISTANCE, offset);
// return col / 9.0;
return col / 5.0;
return col / (5.0 * blendFac);
}

View file

@ -70,7 +70,7 @@ class DebugConsole extends Trait {
var hwin = Id.handle();
if (ui.window(hwin, 0, 0, 280, iron.App.h(), true)) {
var htab = Id.handle({position: 1});
var htab = Id.handle({position: 0});
if (ui.tab(htab, '')) {}
if (ui.tab(htab, 'Inspector')) {
ui.text('Console: ' + lastTrace);
@ -105,6 +105,7 @@ class DebugConsole extends Trait {
var fpsAvg = avg > 0 ? Math.round(1000 / avg) : 0;
if (ui.tab(htab, '$avg ms')) {
// ui.check(Id.handle(), "Show empties");
ui.text('$fpsAvg fps');
var numObjects = iron.Scene.active.meshes.length;
ui.text("meshes: " + numObjects);
var avgMin = Math.round(frameTimeAvgMin * 10000) / 10;

View file

@ -63,8 +63,8 @@ def export_data(fp, sdk_path, is_play=False, is_publish=False, in_viewport=False
shutil.rmtree(build_dir + '/build/html5-resources', onerror=remove_readonly)
if os.path.isdir(build_dir + '/build/krom-resources'):
shutil.rmtree(build_dir + '/build/krom-resources', onerror=remove_readonly)
if os.path.isdir(build_dir + '/window/krom-resources'):
shutil.rmtree(build_dir + '/window/krom-resources', onerror=remove_readonly)
if os.path.isdir(build_dir + '/windowed/krom-resources'):
shutil.rmtree(build_dir + '/windowed/krom-resources', onerror=remove_readonly)
if os.path.isdir(build_dir + '/compiled/Shaders'):
shutil.rmtree(build_dir + '/compiled/Shaders', onerror=remove_readonly)
if os.path.isdir(build_dir + '/compiled/ShaderRaws'):
@ -221,7 +221,7 @@ def compile_project(target_name=None, watch=False, patch=False, no_project_file=
cmd.append('--to')
if kha_target_name == 'krom' and not state.in_viewport:
cmd.append(arm.utils.build_dir() + '/window')
cmd.append(arm.utils.build_dir() + '/windowed')
else:
cmd.append(arm.utils.build_dir())
@ -387,7 +387,7 @@ def get_khajs_path(in_viewport, target):
if in_viewport:
return arm.utils.build_dir() + '/krom/krom.js'
elif target == 'krom':
return arm.utils.build_dir() + '/window/krom/krom.js'
return arm.utils.build_dir() + '/windowed/krom/krom.js'
else: # Browser
return arm.utils.build_dir() + '/html5/kha.js'
@ -485,7 +485,7 @@ def on_compiled(mode): # build, play, play_viewport, publish
elif wrd.arm_play_runtime == 'Krom':
krom_location, krom_path = arm.utils.krom_paths()
os.chdir(krom_location)
args = [krom_path, arm.utils.get_fp_build() + '/window/krom', arm.utils.get_fp_build() + '/window/krom-resources']
args = [krom_path, arm.utils.get_fp_build() + '/windowed/krom', arm.utils.get_fp_build() + '/windowed/krom-resources']
# TODO: Krom sound freezes on MacOS
if arm.utils.get_os() == 'mac':
args.append('--nosound')

View file

@ -432,8 +432,8 @@ def make_deferred(rpdat):
if rpdat.rp_gi == 'Voxel GI':
n = nodes['Image 3D Voxels']
# if rpdat.rp_voxelgi_hdr:
# n.inputs[4].default_value = 'RGBA64'
if rpdat.rp_voxelgi_hdr:
n.inputs[4].default_value = 'RGBA64'
# One lamp only for now - draw shadow map in advance
links.new(nodes['Begin'].outputs[0], nodes['Set Target SM'].inputs[0])
@ -455,7 +455,7 @@ def make_deferred(rpdat):
links.new(nodes['Image 3D Voxels'].outputs[0], nodes['Deferred Light.001'].inputs[4])
elif rpdat.rp_gi == 'Voxel AO':
n = nodes['Image 3D Voxels']
# n.inputs[4].default_value = 'R8'
n.inputs[4].default_value = 'R8'
links.new(nodes['Begin'].outputs[0], nodes['Branch Function Voxelize'].inputs[0])
links.new(nodes['Merge Stages Voxelize'].outputs[0], nodes['Set Target Mesh'].inputs[0])
res = int(rpdat.rp_voxelgi_resolution)

View file

@ -904,17 +904,17 @@ def parse_normal_map_color_input(inp):
parse_teximage_vector = False # Force texCoord for normal map image vector
defplus = c_state.get_rp_renderer() == 'Deferred Plus'
if not c_state.get_arm_export_tangents() or defplus or c_state.mat_get_material().arm_decal: # Compute TBN matrix
frag.write(' vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
frag.write('vec3 texn = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
frag.add_include('../../Shaders/std/normals.glsl')
if defplus:
frag.write(' mat3 TBN = cotangentFrame(n, -vVec, g2.xy, g2.zw);')
frag.write('mat3 TBN = cotangentFrame(n, -vVec, g2.xy, g2.zw);')
else:
frag.write(' mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
frag.write(' n = TBN * normalize(texn);')
frag.write('mat3 TBN = cotangentFrame(n, -vVec, texCoord);')
frag.write('n = TBN * normalize(texn);')
else:
frag.write(' vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
# frag.write(' n = normalize(TBN * normalize(n));')
frag.write(' n = TBN * normalize(n);')
frag.write('vec3 n = ({0}) * 2.0 - 1.0;'.format(parse_vector_input(inp)))
# frag.write('n = normalize(TBN * normalize(n));')
frag.write('n = TBN * normalize(n);')
con.add_elem('tang', 3)
parse_teximage_vector = True

View file

@ -72,7 +72,7 @@ def make_finalize(con_mesh):
vert.add_out('vec3 eyeDir')
vert.add_uniform('vec3 eye', '_cameraPosition')
vert.write('eyeDir = eye - wposition;')
frag.prepend('vec3 vVec = normalize(eyeDir);')
frag.prepend_header('vec3 vVec = normalize(eyeDir);')
export_wpos = False
if frag.contains('wposition') and not frag.contains('vec3 wposition'):
@ -227,9 +227,7 @@ def make_base(con_mesh, parse_opacity):
else:
vert.add_out('vec3 wnormal')
write_norpos(con_mesh, vert)
frag.write_pre = True
frag.write_main_header(' vec3 n = normalize(wnormal);')
frag.write_pre = False
frag.prepend_header('vec3 n = normalize(wnormal);')
if tese != None:
tese.add_uniform('mat4 VP', '_viewProjectionMatrix')
@ -351,9 +349,7 @@ def make_deferred_plus(con_mesh):
vert.add_out('vec3 wnormal')
write_norpos(con_mesh, vert)
frag.write_pre = True
frag.write_main_header('vec3 n = normalize(wnormal);')
frag.write_pre = False
frag.prepend_header('vec3 n = normalize(wnormal);')
frag.add_uniform('float materialID', link='_objectInfoMaterialIndex')
@ -400,9 +396,7 @@ def make_forward_mobile(con_mesh):
vert.add_out('vec3 wnormal')
write_norpos(con_mesh, vert)
frag.write_pre = True
frag.write_main_header('vec3 n = normalize(wnormal);')
frag.write_pre = False
frag.prepend_header('vec3 n = normalize(wnormal);')
frag.add_include('../../Shaders/std/math.glsl')
frag.add_include('../../Shaders/std/brdf.glsl')

View file

@ -33,11 +33,11 @@ def make_gi(context_id):
frag.write_header('#extension GL_ARB_shader_image_load_store : enable')
rpdat = arm.utils.get_rp()
# if rpdat.rp_voxelgi_hdr:
# frag.add_uniform('layout(RGBA16) image3D voxels')
# else:
# frag.add_uniform('layout(RGBA8) image3D voxels')
frag.add_uniform('layout(r32ui) uimage3D voxels')
if rpdat.rp_voxelgi_hdr:
frag.add_uniform('layout(rgba16) image3D voxels')
else:
# frag.add_uniform('layout(rgba8) image3D voxels')
frag.add_uniform('layout(r32ui) uimage3D voxels')
frag.add_uniform('vec3 lightPos', '_lampPosition')
frag.add_uniform('vec3 lightColor', '_lampColorVoxel')
@ -207,51 +207,51 @@ def make_gi(context_id):
if rpdat.arm_voxelgi_emission:
frag.write('color = min(color * 0.9, vec3(0.9)) + min(color / 200.0, 0.1);') # Higher range to allow emission
# if rpdat.rp_voxelgi_hdr:
# frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
# else:
frag.write('color = clamp(color, vec3(0.0), vec3(1.0));')
frag.write('uint val = convVec4ToRGBA8(vec4(color, 1.0) * 255);')
frag.write('imageAtomicMax(voxels, ivec3(voxelgiResolution * voxel), val);')
# frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
# frag.write('imageAtomicRGBA8Avg(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
# frag.write('ivec3 coords = ivec3(voxelgiResolution * voxel);')
# if parse_opacity:
# frag.write('vec4 val = vec4(color, opacity);')
# else:
# frag.write('vec4 val = vec4(color, 1.0);')
# frag.write('val *= 255.0;')
# frag.write('uint newVal = encUnsignedNibble(convVec4ToRGBA8(val), 1);')
# frag.write('uint prevStoredVal = 0;')
# frag.write('uint currStoredVal;')
# # frag.write('int counter = 0;')
# # frag.write('while ((currStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal && counter < 16) {')
# frag.write('while ((currStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal) {')
# frag.write(' vec4 rval = convRGBA8ToVec4(currStoredVal & 0xFEFEFEFE);')
# frag.write(' uint n = decUnsignedNibble(currStoredVal);')
# frag.write(' rval = rval * n + val;')
# frag.write(' rval /= ++n;')
# frag.write(' rval = round(rval / 2) * 2;')
# frag.write(' newVal = encUnsignedNibble(convVec4ToRGBA8(rval), n);')
# frag.write(' prevStoredVal = currStoredVal;')
# # frag.write(' counter++;')
# frag.write('}')
# frag.write('val.rgb *= 255.0f;')
# frag.write('uint newVal = convVec4ToRGBA8(val);')
# frag.write('uint prevStoredVal = 0;')
# frag.write('uint curStoredVal;')
# frag.write('while ((curStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal) {')
# frag.write(' prevStoredVal = curStoredVal;')
# frag.write(' vec4 rval = convRGBA8ToVec4(curStoredVal);')
# frag.write(' rval.xyz = (rval.xyz * rval.w);')
# frag.write(' vec4 curValF = rval + val;')
# frag.write(' curValF.xyz /= (curValF.w);')
# frag.write(' newVal = convVec4ToRGBA8(curValF);')
# frag.write('}')
if rpdat.rp_voxelgi_hdr:
frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
else:
frag.write('uint val = convVec4ToRGBA8(vec4(color, 1.0) * 255);')
frag.write('imageAtomicMax(voxels, ivec3(voxelgiResolution * voxel), val);')
# frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
# frag.write('imageAtomicRGBA8Avg(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
# frag.write('ivec3 coords = ivec3(voxelgiResolution * voxel);')
# if parse_opacity:
# frag.write('vec4 val = vec4(color, opacity);')
# else:
# frag.write('vec4 val = vec4(color, 1.0);')
# frag.write('val *= 255.0;')
# frag.write('uint newVal = encUnsignedNibble(convVec4ToRGBA8(val), 1);')
# frag.write('uint prevStoredVal = 0;')
# frag.write('uint currStoredVal;')
# # frag.write('int counter = 0;')
# # frag.write('while ((currStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal && counter < 16) {')
# frag.write('while ((currStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal) {')
# frag.write(' vec4 rval = convRGBA8ToVec4(currStoredVal & 0xFEFEFEFE);')
# frag.write(' uint n = decUnsignedNibble(currStoredVal);')
# frag.write(' rval = rval * n + val;')
# frag.write(' rval /= ++n;')
# frag.write(' rval = round(rval / 2) * 2;')
# frag.write(' newVal = encUnsignedNibble(convVec4ToRGBA8(rval), n);')
# frag.write(' prevStoredVal = currStoredVal;')
# # frag.write(' counter++;')
# frag.write('}')
# frag.write('val.rgb *= 255.0f;')
# frag.write('uint newVal = convVec4ToRGBA8(val);')
# frag.write('uint prevStoredVal = 0;')
# frag.write('uint curStoredVal;')
# frag.write('while ((curStoredVal = imageAtomicCompSwap(voxels, coords, prevStoredVal, newVal)) != prevStoredVal) {')
# frag.write(' prevStoredVal = curStoredVal;')
# frag.write(' vec4 rval = convRGBA8ToVec4(curStoredVal);')
# frag.write(' rval.xyz = (rval.xyz * rval.w);')
# frag.write(' vec4 curValF = rval + val;')
# frag.write(' curValF.xyz /= (curValF.w);')
# frag.write(' newVal = convVec4ToRGBA8(curValF);')
# frag.write('}')
return con_voxel
@ -274,7 +274,8 @@ def make_ao(context_id):
frag.write_header('#extension GL_ARB_shader_image_load_store : enable')
rpdat = arm.utils.get_rp()
frag.add_uniform('layout(r32ui) uimage3D voxels')
# frag.add_uniform('layout(r32ui) uimage3D voxels')
frag.add_uniform('layout(r8) image3D voxels')
frag.write('if (abs(voxposition.z) > ' + rpdat.rp_voxelgi_resolution_z + ' || abs(voxposition.x) > 1 || abs(voxposition.y) > 1) return;')
vert.add_include('../../Shaders/compiled.glsl')
@ -309,8 +310,6 @@ def make_ao(context_id):
geom.write('EndPrimitive();')
frag.write('vec3 voxel = voxposition * 0.5 + vec3(0.5);')
# frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(1.0));')
frag.write('uint val = convVec4ToRGBA8(vec4(1.0) * 255);')
frag.write('imageAtomicMax(voxels, ivec3(voxelgiResolution * voxel), val);')
frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(1.0));')
return con_voxel

View file

@ -62,6 +62,9 @@ class Shader:
def prepend(self, s):
self.main_pre = s + '\n' + self.main_pre
def prepend_header(self, s):
self.main_header = s + '\n' + self.main_header
def write(self, s):
if self.lock:
return

View file

@ -227,6 +227,10 @@ def init_properties():
bpy.types.World.arm_voxelgi_occ = bpy.props.FloatProperty(name="Occlussion", description="", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_env = bpy.props.FloatProperty(name="Env Map", description="Contribute light from environment map", default=0.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_step = bpy.props.FloatProperty(name="Step", description="Step size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_offset_diff = bpy.props.FloatProperty(name="Diffuse Offset", description="Offset size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_offset_spec = bpy.props.FloatProperty(name="Specular Offset", description="Step size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_offset_shadow = bpy.props.FloatProperty(name="Shadow Offset", description="Step size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_offset_refract = bpy.props.FloatProperty(name="Refract Offset", description="Step size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_voxelgi_range = bpy.props.FloatProperty(name="Range", description="Maximum range", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_sss_width = bpy.props.FloatProperty(name="SSS Width", description="SSS blur strength", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.arm_envtex_name = bpy.props.StringProperty(name="Environment Texture", default='')

View file

@ -199,7 +199,7 @@ class ArmRPListItem(bpy.types.PropertyGroup):
name="Resolution", description="Render at specific resolution, regardless of display resolution", default='Display', update=update_renderpath)
arm_ssr_half_res = bpy.props.BoolProperty(name="Half Res", description="Trace in half resolution", default=True, update=update_renderpath)
rp_voxelgi_hdr = bpy.props.BoolProperty(name="HDR", description="Store voxels in RGBA64 instead of RGBA32", default=False, update=update_renderpath)
rp_voxelgi_hdr = bpy.props.BoolProperty(name="HDR Voxels", description="Store voxels in RGBA64 instead of RGBA32", default=False, update=update_renderpath)
arm_voxelgi_dimensions = bpy.props.FloatProperty(name="Dimensions", description="Voxelization bounds",default=16, update=assets.invalidate_shader_cache)
arm_voxelgi_revoxelize = bpy.props.BoolProperty(name="Revoxelize", description="Revoxelize scene each frame", default=False, update=assets.invalidate_shader_cache)
# arm_voxelgi_multibounce = bpy.props.BoolProperty(name="Multi-bounce", description="Accumulate multiple light bounces", default=False, update=assets.invalidate_shader_cache)
@ -207,7 +207,7 @@ class ArmRPListItem(bpy.types.PropertyGroup):
# arm_voxelgi_anisotropic = bpy.props.BoolProperty(name="Anisotropic", description="Use anisotropic voxels", default=False, update=update_renderpath)
arm_voxelgi_shadows = bpy.props.BoolProperty(name="Trace Shadows", description="Use voxels to render shadows", default=False, update=update_renderpath)
arm_voxelgi_refraction = bpy.props.BoolProperty(name="Trace Refraction", description="Use voxels to render refraction", default=False, update=update_renderpath)
arm_voxelgi_emission = bpy.props.BoolProperty(name="Emission", description="Encode emission into voxelized data", default=False, update=update_renderpath)
arm_voxelgi_emission = bpy.props.BoolProperty(name="Emission Voxels", description="Encode emission into voxelized data", default=False, update=update_renderpath)
arm_samples_per_pixel = EnumProperty(
items=[('1', '1X', '1X'),
('2', '2X', '2X'),

View file

@ -982,13 +982,13 @@ class ArmRenderPathPanel(bpy.types.Panel):
layout.prop(rpdat, 'arm_voxelgi_revoxelize')
if rpdat.arm_voxelgi_revoxelize:
layout.prop(rpdat, 'arm_voxelgi_camera')
# layout.prop(rpdat, 'arm_voxelgi_multibounce')
# layout.prop(rpdat, 'arm_voxelgi_anisotropic')
layout.prop(rpdat, 'arm_voxelgi_shadows')
layout.prop(rpdat, 'arm_voxelgi_refraction')
# layout.prop(rpdat, 'rp_voxelgi_hdr')
if rpdat.rp_gi == 'Voxel GI':
layout.prop(rpdat, 'arm_voxelgi_refraction')
layout.prop(rpdat, 'arm_voxelgi_emission')
layout.prop(rpdat, 'rp_voxelgi_hdr')
# layout.prop(rpdat, 'arm_voxelgi_multibounce')
layout.separator()
layout.prop(rpdat, "rp_hdr")
@ -1050,14 +1050,17 @@ class ArmRenderPropsPanel(bpy.types.Panel):
layout.prop(wrd, 'arm_pcss_rings')
layout.label('Clouds')
layout.prop(wrd, 'arm_clouds_density')
layout.prop(wrd, 'arm_clouds_size')
layout.prop(wrd, 'arm_clouds_lower')
layout.prop(wrd, 'arm_clouds_upper')
row = layout.row()
row.prop(wrd, 'arm_clouds_density')
row.prop(wrd, 'arm_clouds_size')
row = layout.row()
row.prop(wrd, 'arm_clouds_lower')
row.prop(wrd, 'arm_clouds_upper')
layout.prop(wrd, 'arm_clouds_wind')
layout.prop(wrd, 'arm_clouds_secondary')
layout.prop(wrd, 'arm_clouds_precipitation')
layout.prop(wrd, 'arm_clouds_eccentricity')
row = layout.row()
row.prop(wrd, 'arm_clouds_precipitation')
row.prop(wrd, 'arm_clouds_eccentricity')
layout.label('Voxel GI')
row = layout.row()
@ -1066,28 +1069,38 @@ class ArmRenderPropsPanel(bpy.types.Panel):
row = layout.row()
row.prop(wrd, 'arm_voxelgi_occ')
row.prop(wrd, 'arm_voxelgi_env')
# row = layout.row()
# row.prop(wrd, 'arm_voxelgi_step')
# row.prop(wrd, 'arm_voxelgi_range')
row = layout.row()
row.prop(wrd, 'arm_voxelgi_step')
row.prop(wrd, 'arm_voxelgi_range')
row = layout.row()
row.prop(wrd, 'arm_voxelgi_offset_diff')
row.prop(wrd, 'arm_voxelgi_offset_spec')
row = layout.row()
row.prop(wrd, 'arm_voxelgi_offset_shadow')
row.prop(wrd, 'arm_voxelgi_offset_refract')
layout.prop(wrd, 'arm_voxelgi_diff_cones')
layout.label('SSAO')
layout.prop(wrd, 'arm_ssao_size')
layout.prop(wrd, 'arm_ssao_strength')
row = layout.row()
row.prop(wrd, 'arm_ssao_size')
row.prop(wrd, 'arm_ssao_strength')
layout.label('Bloom')
layout.prop(wrd, 'arm_bloom_threshold')
layout.prop(wrd, 'arm_bloom_strength')
row = layout.row()
row.prop(wrd, 'arm_bloom_threshold')
row.prop(wrd, 'arm_bloom_strength')
layout.prop(wrd, 'arm_bloom_radius')
layout.label('Motion Blur')
layout.prop(wrd, 'arm_motion_blur_intensity')
layout.label('SSR')
layout.prop(wrd, 'arm_ssr_ray_step')
layout.prop(wrd, 'arm_ssr_min_ray_step')
layout.prop(wrd, 'arm_ssr_search_dist')
layout.prop(wrd, 'arm_ssr_falloff_exp')
row = layout.row()
row.prop(wrd, 'arm_ssr_ray_step')
row.prop(wrd, 'arm_ssr_min_ray_step')
row = layout.row()
row.prop(wrd, 'arm_ssr_search_dist')
row.prop(wrd, 'arm_ssr_falloff_exp')
layout.prop(wrd, 'arm_ssr_jitter')
layout.label('SSS')
@ -1107,8 +1120,9 @@ class ArmRenderPropsPanel(bpy.types.Panel):
layout.prop(wrd, 'arm_grain_strength')
layout.prop(wrd, 'arm_fog')
layout.prop(wrd, 'arm_fog_color')
layout.prop(wrd, 'arm_fog_amounta')
layout.prop(wrd, 'arm_fog_amountb')
row = layout.row()
row.prop(wrd, 'arm_fog_amounta')
row.prop(wrd, 'arm_fog_amountb')
layout.prop(wrd, 'arm_fisheye')
layout.prop(wrd, 'arm_vignette')
layout.prop(wrd, 'arm_lens_texture')

View file

@ -442,9 +442,7 @@ const float compoDOFLength = 160.0;
if rpdat.rp_gi == 'Voxel GI' or rpdat.rp_gi == 'Voxel AO':
halfext = round(rpdat.arm_voxelgi_dimensions / 2.0)
f.write(
# """const int voxelgiResolution = """ + str(rpdat.rp_voxelgi_resolution) + """;
"""const ivec3 voxelgiResolution = ivec3(""" + str(rpdat.rp_voxelgi_resolution) + """, """ + str(rpdat.rp_voxelgi_resolution) + """, """ + str(int(int(rpdat.rp_voxelgi_resolution) * float(rpdat.rp_voxelgi_resolution_z))) + """);
//const float voxelgiHalfExtents = """ + str(round(rpdat.arm_voxelgi_dimensions / 2.0)) + """;
const vec3 voxelgiHalfExtents = vec3(""" + str(halfext) + """, """ + str(halfext) + """, """ + str(round(halfext * float(rpdat.rp_voxelgi_resolution_z))) + """);
const float voxelgiDiff = """ + str(round(wrd.arm_voxelgi_diff * 100) / 100) + """;
const float voxelgiSpec = """ + str(round(wrd.arm_voxelgi_spec * 100) / 100) + """;
@ -452,6 +450,10 @@ const float voxelgiOcc = """ + str(round(wrd.arm_voxelgi_occ * 100) / 100) + """
const float voxelgiEnv = """ + str(round(wrd.arm_voxelgi_env * 100) / 100) + """;
const float voxelgiStep = """ + str(round(wrd.arm_voxelgi_step * 100) / 100) + """;
const float voxelgiRange = """ + str(round(wrd.arm_voxelgi_range * 100) / 100) + """;
const float voxelgiOffsetDiff = """ + str(round(wrd.arm_voxelgi_offset_diff * 100) / 100) + """;
const float voxelgiOffsetSpec = """ + str(round(wrd.arm_voxelgi_offset_spec * 100) / 100) + """;
const float voxelgiOffsetShadow = """ + str(round(wrd.arm_voxelgi_offset_shadow * 100) / 100) + """;
const float voxelgiOffsetRefract = """ + str(round(wrd.arm_voxelgi_offset_refract * 100) / 100) + """;
""")
if rpdat.rp_sss_state == 'On':