Faster voxels
This commit is contained in:
parent
d8d33f32e1
commit
21c89b3eec
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -52,6 +52,11 @@
|
|||
"name": "eye",
|
||||
"link": "_cameraPosition"
|
||||
},
|
||||
{
|
||||
"name": "eyeSnap",
|
||||
"link": "_cameraPositionSnap",
|
||||
"ifdef": ["_VoxelGICam"]
|
||||
},
|
||||
{
|
||||
"name": "eyeLook",
|
||||
"link": "_cameraLook"
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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='')
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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':
|
||||
|
|
Loading…
Reference in a new issue