From e50f60454ecf0f7fe15bd1e447bfecb707862483 Mon Sep 17 00:00:00 2001 From: Lubos Lenco Date: Sun, 23 Oct 2016 15:32:26 +0200 Subject: [PATCH] Shaders ready. --- .../compositor_pass/compositor_pass.frag.glsl | 51 ++++++++++--------- .../compositor_pass.shader.json | 19 +++++-- .../compositor_pass/compositor_pass.vert.glsl | 26 +++++----- Shaders/deferred/translucent.frag.glsl | 6 ++- Shaders/include/overlay.frag.glsl | 8 ++- .../motion_blur_pass.frag.glsl | 2 +- Shaders/std/dof.glsl | 4 +- .../volumetric_light.frag.glsl | 1 + Sources/armory/trait/internal/RigidBody.hx | 6 +-- blender/exporter.py | 12 ++--- blender/make.py | 4 +- blender/make_renderpath.py | 10 ++-- blender/props.py | 4 +- blender/props_ui.py | 2 +- 14 files changed, 90 insertions(+), 65 deletions(-) diff --git a/Shaders/compositor_pass/compositor_pass.frag.glsl b/Shaders/compositor_pass/compositor_pass.frag.glsl index fb7a0aac..49ca8446 100644 --- a/Shaders/compositor_pass/compositor_pass.frag.glsl +++ b/Shaders/compositor_pass/compositor_pass.frag.glsl @@ -19,14 +19,17 @@ uniform sampler2D gbufferD; uniform sampler2D gbuffer0; uniform sampler2D gbuffer1; -#ifdef _CompoPos -uniform vec3 eye; -uniform vec3 eyeLook; -#endif +// #ifdef _CompoPos +// uniform vec3 eye; +// uniform vec3 eyeLook; +// #endif #ifdef _CompoGlare uniform vec3 light; uniform mat4 VP; +uniform vec3 eye; +uniform vec3 eyeLook; +uniform float aspectRatio; #endif // #ifdef _CompoFXAA @@ -41,12 +44,10 @@ uniform float time; uniform float dynamicScale; #endif -uniform float aspectRatio; - in vec2 texCoord; -#ifdef _CompoPos - in vec3 viewRay; -#endif +// #ifdef _CompoPos + // in vec3 viewRay; +// #endif out vec4 fragColor; #ifdef _CompoFog @@ -73,6 +74,7 @@ float vignette() { return 0.3 + 0.7 * pow(16.0 * texCoord.x * texCoord.y * (1.0 - texCoord.x) * (1.0 - texCoord.y), 0.2); } +#ifdef _CompoGlare // Based on lense flare implementation by musk // https://www.shadertoy.com/view/4sX3Rs vec3 lensflare(vec2 uv, vec2 pos) { @@ -102,6 +104,7 @@ vec3 lensflare(vec2 uv, vec2 pos) { c.b += f23 + f43 + f53 + f63; return c; } +#endif void main() { vec2 texCo = texCoord; @@ -202,22 +205,24 @@ void main() { #endif #ifdef _CompoGlare - vec4 lndc = VP * vec4(light, 1.0); - lndc.xy /= lndc.w; - float lightDistance = distance(eye, light); - vec2 lss = lndc.xy * 0.5 + 0.5; - float lssdepth = linearize(texture(gbufferD, lss).r * 2.0 - 1.0); - if (lssdepth >= lightDistance) { - vec2 lensuv = (texCoord - 0.5) * 2.0; - lensuv.x *= aspectRatio; - vec3 lensflarecol = vec3(1.4, 1.2, 1.0) * lensflare(lensuv, lndc.xy); - col.rgb += lensflarecol; + if (dot(light, eyeLook) > 0.0) { // Facing light + vec4 lndc = VP * vec4(light, 1.0); + lndc.xy /= lndc.w; + vec2 lss = lndc.xy * 0.5 + 0.5; + float lssdepth = linearize(texture(gbufferD, lss).r * 2.0 - 1.0); + float lightDistance = distance(eye, light); + if (lightDistance <= lssdepth) { + vec2 lensuv = texCo * 2.0 - 1.0; + lensuv.x *= aspectRatio; + vec3 lensflarecol = vec3(1.4, 1.2, 1.0) * lensflare(lensuv, lndc.xy); + col.rgb += lensflarecol; + } } #endif #ifdef _CompoGrain // const float compoGrainStrength = 4.0; - float x = (texCoord.x + 4.0) * (texCoord.y + 4.0) * (time * 10.0); + float x = (texCo.x + 4.0) * (texCo.y + 4.0) * (time * 10.0); col.rgb += vec3(mod((mod(x, 13.0) + 1.0) * (mod(x, 123.0) + 1.0), 0.01) - 0.005) * compoGrainStrength; #endif @@ -244,8 +249,8 @@ void main() { // #ifdef _CompoContrast // -0.5 - 0.5 - const float compoContrast = 0.2; - col.rgb = ((col.rgb - 0.5) * max(compoContrast + 1.0, 0.0)) + 0.5; + // const float compoContrast = 0.2; + // col.rgb = ((col.rgb - 0.5) * max(compoContrast + 1.0, 0.0)) + 0.5; // #endif // #ifdef _CompoBrighness @@ -254,7 +259,7 @@ void main() { #ifdef _CompoLetterbox // const float compoLetterboxSize = 0.1; - col.rgb *= 1.0 - step(0.5 - compoLetterboxSize, abs(0.5 - texCoord.y)); + col.rgb *= 1.0 - step(0.5 - compoLetterboxSize, abs(0.5 - texCo.y)); #endif fragColor = vec4(col, 1.0); diff --git a/Shaders/compositor_pass/compositor_pass.shader.json b/Shaders/compositor_pass/compositor_pass.shader.json index 397a7f5b..f53cf1d5 100755 --- a/Shaders/compositor_pass/compositor_pass.shader.json +++ b/Shaders/compositor_pass/compositor_pass.shader.json @@ -9,17 +9,27 @@ { "name": "eye", "link": "_cameraPosition", - "ifdef": ["_CompoPos"] + "ifdef": ["_CompoGlare"] + }, + { + "name": "eye", + "link": "_cameraPosition", + "ifdef": ["_Disabled_CompoPos"] }, { "name": "eyeLook", "link": "_cameraLook", - "ifdef": ["_CompoPos"] + "ifdef": ["_CompoGlare"] + }, + { + "name": "eyeLook", + "link": "_cameraLook", + "ifdef": ["_Disabled_CompoPos"] }, { "name": "invVP", "link": "_inverseViewProjectionMatrix", - "ifdef": ["_CompoPos"] + "ifdef": ["_Disabled_CompoPos"] }, { "name": "light", @@ -56,7 +66,8 @@ }, { "name": "aspectRatio", - "link": "_aspectRatio" + "link": "_aspectRatioF", + "ifdef": ["_CompoGlare"] } ], "texture_params": [], diff --git a/Shaders/compositor_pass/compositor_pass.vert.glsl b/Shaders/compositor_pass/compositor_pass.vert.glsl index 8588e876..9839e530 100644 --- a/Shaders/compositor_pass/compositor_pass.vert.glsl +++ b/Shaders/compositor_pass/compositor_pass.vert.glsl @@ -4,17 +4,17 @@ precision highp float; #endif -#ifdef _CompoPos - uniform mat4 invVP; - uniform vec3 eye; -#endif +// #ifdef _CompoPos + // uniform mat4 invVP; + // uniform vec3 eye; +// #endif in vec2 pos; out vec2 texCoord; -#ifdef _CompoPos - out vec3 viewRay; -#endif +// #ifdef _CompoPos + // out vec3 viewRay; +// #endif void main() { // Scale vertex attribute to [0-1] range @@ -23,11 +23,11 @@ void main() { gl_Position = vec4(pos.xy, 0.0, 1.0); -#ifdef _CompoPos +// #ifdef _CompoPos // NDC (at the back of cube) - vec4 v = vec4(pos.xy, 1.0, 1.0); - v = vec4(invVP * v); - v.xyz /= v.w; - viewRay = v.xyz - eye; -#endif + // vec4 v = vec4(pos.xy, 1.0, 1.0); + // v = vec4(invVP * v); + // v.xyz /= v.w; + // viewRay = v.xyz - eye; +// #endif } diff --git a/Shaders/deferred/translucent.frag.glsl b/Shaders/deferred/translucent.frag.glsl index b571e029..f992a549 100644 --- a/Shaders/deferred/translucent.frag.glsl +++ b/Shaders/deferred/translucent.frag.glsl @@ -132,7 +132,11 @@ void main() { #endif // Direct - vec3 direct = diffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH, dotLV) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH, dotLH); +#ifdef _OrenNayar + vec3 direct = orenNayarDiffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH); +#else + vec3 direct = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH); +#endif if (lightType == 2) { // Spot float spotEffect = dot(lightDir, l); diff --git a/Shaders/include/overlay.frag.glsl b/Shaders/include/overlay.frag.glsl index 7b711d65..0e2bfabb 100644 --- a/Shaders/include/overlay.frag.glsl +++ b/Shaders/include/overlay.frag.glsl @@ -146,7 +146,11 @@ void main() { #endif // Direct - vec3 direct = diffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH, dotLV) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH, dotLH); +#ifdef _OrenNayar + vec3 direct = orenNayarDiffuseBRDF(albedo, roughness, dotNV, dotNL, dotVH) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH); +#else + vec3 direct = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH); +#endif direct = direct * lightColor * lightStrength; // Indirect @@ -168,7 +172,7 @@ void main() { vec3 indirectSpecular = prefilteredColor * (f0 * envBRDF.x + envBRDF.y); indirect += indirectSpecular; #endif - indirect = indirect * envmapStrength // * lightColor * lightStrength; + indirect = indirect * envmapStrength; // * lightColor * lightStrength; fragColor = vec4(vec3(direct * visibility + indirect), 1.0); #ifdef _OccTex diff --git a/Shaders/motion_blur_pass/motion_blur_pass.frag.glsl b/Shaders/motion_blur_pass/motion_blur_pass.frag.glsl index 1c0b5436..61046108 100644 --- a/Shaders/motion_blur_pass/motion_blur_pass.frag.glsl +++ b/Shaders/motion_blur_pass/motion_blur_pass.frag.glsl @@ -26,7 +26,7 @@ out vec4 fragColor; vec2 getVelocity(vec2 coord, float depth) { vec4 currentPos = vec4(coord.xy * 2.0 - 1.0, depth, 1.0); - vec4 worldPos = vec4(getPos(eye, eyelook, viewRay, depth), 1.0); + vec4 worldPos = vec4(getPos(eye, eyeLook, viewRay, depth), 1.0); vec4 previousPos = prevVP * worldPos; previousPos /= previousPos.w; vec2 velocity = (currentPos - previousPos).xy / 40.0; diff --git a/Shaders/std/dof.glsl b/Shaders/std/dof.glsl index 3159eb11..d5fb2974 100644 --- a/Shaders/std/dof.glsl +++ b/Shaders/std/dof.glsl @@ -34,7 +34,7 @@ vec3 color(vec2 coords, const float blur, const sampler2D tex, const vec2 texSte } vec3 dof(const vec2 texCoord, const float gdepth, const sampler2D tex, const sampler2D gbufferD, const vec2 texStep) { - float depth = linearize(gdepth * 0.5 + 0.5); + float depth = linearize(gdepth); const float fDepth = compoDOFDistance; // float fDepth = linearize(texture(gbufferD, focus).r * 2.0 - 1.0); // Autofocus @@ -218,7 +218,7 @@ vec3 dof(const vec2 texCoord, const float gdepth, const sampler2D tex, const sam col /= s; } - + return col; } diff --git a/Shaders/volumetric_light/volumetric_light.frag.glsl b/Shaders/volumetric_light/volumetric_light.frag.glsl index 6bdc5a0b..da0a7581 100644 --- a/Shaders/volumetric_light/volumetric_light.frag.glsl +++ b/Shaders/volumetric_light/volumetric_light.frag.glsl @@ -6,6 +6,7 @@ precision mediump float; #endif #include "../compiled.glsl" +#include "../std/gbuffer.glsl" uniform sampler2D gbufferD; #ifndef _NoShadows diff --git a/Sources/armory/trait/internal/RigidBody.hx b/Sources/armory/trait/internal/RigidBody.hx index 1baa3fca..319076e7 100644 --- a/Sources/armory/trait/internal/RigidBody.hx +++ b/Sources/armory/trait/internal/RigidBody.hx @@ -17,7 +17,7 @@ class RigidBody extends Trait { #else var shape:Shape; - var _motionState:BtMotionState; + var _motionState:BtMotionStatePointer; public var physics:PhysicsWorld; public var transform:Transform = null; @@ -128,7 +128,7 @@ class RigidBody extends Trait { if (!shapeConvexCreated) { if (shape != Shape.StaticMesh && shape != Shape.Terrain) { - _shape.ptr.calculateLocalInertia(mass, _inertia.value); + _shape.ptr.calculateLocalInertia(mass, _inertia); } var _bodyCI = BtRigidBodyConstructionInfo.create(mass, _motionState, _shape, _inertia.value); body = BtRigidBody.create(_bodyCI.value); @@ -136,7 +136,7 @@ class RigidBody extends Trait { body.ptr.setRollingFriction(friction); } else { - _shapeConvex.ptr.calculateLocalInertia(mass, _inertia.value); + _shapeConvex.ptr.calculateLocalInertia(mass, _inertia); var _bodyCI = BtRigidBodyConstructionInfo.create(mass, _motionState, _shapeConvex, _inertia.value); body = BtRigidBody.create(_bodyCI.value); } diff --git a/blender/exporter.py b/blender/exporter.py index 1e413129..094892f6 100644 --- a/blender/exporter.py +++ b/blender/exporter.py @@ -1666,8 +1666,6 @@ class ArmoryExporter: return print('Exporting mesh ' + bobject.data.name) - if bobject.type != 'FONT' and len(bobject.data.vertices) > 40000: - print('Armory Warning: "' + bobject.name + '" contains over 40000 vertices, split mesh to smaller parts to fit into 16-bit indices') o = {} o['name'] = oid @@ -1970,10 +1968,12 @@ class ArmoryExporter: # Viewport Camera - override fov for every camera for now if bpy.data.worlds['Arm'].arm_play_viewport_camera: # Extract fov from projection - # yscale = self.get_viewport_projection_matrix()[1][1] - # fov = math.atan(1.0 / yscale) * 0.9 - # o['fov'] = fov - o['fov'] = math.pi / 3.0 + yscale = self.get_viewport_projection_matrix()[1][1] + if yscale < 0: + yscale *= -1 # Reverse + fov = math.atan(1.0 / yscale) * 0.9 + o['fov'] = fov + # o['fov'] = math.pi / 3.0 if objref.type == 'PERSP': o['type'] = 'perspective' diff --git a/blender/make.py b/blender/make.py index a45f0733..13169ced 100755 --- a/blender/make.py +++ b/blender/make.py @@ -403,7 +403,7 @@ def clean_project(): wrd = bpy.data.worlds['Arm'] # Preserve envmaps - if not wrd.arm_clean_envmaps: + if wrd.arm_cache_envmaps: envmaps_path = 'build/compiled/Assets/envmaps' if os.path.isdir(envmaps_path): shutil.move(envmaps_path, '.') @@ -413,7 +413,7 @@ def clean_project(): shutil.rmtree('build') # Move envmaps back - if not wrd.arm_clean_envmaps and os.path.isdir('envmaps'): + if wrd.arm_cache_envmaps and os.path.isdir('envmaps'): os.makedirs('build/compiled/Assets') shutil.move('envmaps', 'build/compiled/Assets') diff --git a/blender/make_renderpath.py b/blender/make_renderpath.py index a396d3d6..ba7b01ed 100755 --- a/blender/make_renderpath.py +++ b/blender/make_renderpath.py @@ -224,7 +224,7 @@ def make_draw_compositor(stage, node_group, node, with_fxaa=False): compositor_defs = make_compositor.parse_defs(bpy.data.scenes[0].node_tree) # Thrown in scene 0 for now # Additional compositor flags compo_depth = False # Read depth - compo_pos = False # Construct position from depth + # compo_pos = False # Construct position from depth if with_fxaa: # FXAA directly in compositor, useful for forward path compositor_defs += '_CompoFXAA' if wrd.generate_letterbox: @@ -235,13 +235,13 @@ def make_draw_compositor(stage, node_group, node, with_fxaa=False): compositor_defs += '_CompoExposure' if wrd.generate_fog: compositor_defs += '_CompoFog' - compo_pos = True + # compo_pos = True if build_node_tree.cam.dof_distance > 0.0: compositor_defs += '_CompoDOF' compo_depth = True - if compo_pos: - compositor_defs += '_CompoPos' - compo_depth = True + # if compo_pos: + # compositor_defs += '_CompoPos' + # compo_depth = True if compo_depth: compositor_defs += '_CompoDepth' diff --git a/blender/props.py b/blender/props.py index 856d2214..9600696b 100755 --- a/blender/props.py +++ b/blender/props.py @@ -52,7 +52,7 @@ def init_properties(): bpy.types.World.arm_object_advanced = BoolProperty(name="Advanced", default=False) bpy.types.World.arm_material_advanced = BoolProperty(name="Advanced", default=False) bpy.types.World.arm_cache_shaders = BoolProperty(name="Cache Shaders", description="Do not rebuild existing shaders", default=True, update=assets.invalidate_shader_cache) - bpy.types.World.arm_clean_envmaps = BoolProperty(name="Clean Envmaps", description="Remove prefiltered maps when cleaning project", default=True) + bpy.types.World.arm_cache_envmaps = BoolProperty(name="Cache Envmaps", description="Do not remove prefiltered maps when cleaning project", default=True) bpy.types.World.arm_play_live_patch = BoolProperty(name="Live Patching", description="Sync running player data to Blender", default=True) bpy.types.World.arm_play_auto_build = BoolProperty(name="Auto Build", description="Rebuild scene on operator changes", default=True) bpy.types.World.arm_play_viewport_camera = BoolProperty(name="Viewport Camera", description="Start player at viewport camera position", default=False) @@ -178,7 +178,7 @@ def init_properties(): bpy.types.World.generate_ssao_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=1.0, min=0.0, max=1.0, update=assets.invalidate_shader_cache) bpy.types.World.generate_shadows = bpy.props.BoolProperty(name="Shadows", default=True, update=assets.invalidate_shader_cache) bpy.types.World.generate_bloom = bpy.props.BoolProperty(name="Bloom", default=True, update=assets.invalidate_shader_cache) - bpy.types.World.generate_bloom_treshold = bpy.props.FloatProperty(name="Treshold", default=4.0, update=assets.invalidate_shader_cache) + bpy.types.World.generate_bloom_treshold = bpy.props.FloatProperty(name="Treshold", default=6.0, update=assets.invalidate_shader_cache) bpy.types.World.generate_bloom_strength = bpy.props.FloatProperty(name="Strength", default=1.0, update=assets.invalidate_shader_cache) bpy.types.World.generate_bloom_radius = bpy.props.FloatProperty(name="Radius", default=1.0, update=assets.invalidate_shader_cache) bpy.types.World.generate_motion_blur = bpy.props.BoolProperty(name="Motion Blur", default=True, update=assets.invalidate_shader_cache) diff --git a/blender/props_ui.py b/blender/props_ui.py index 62d81786..ebac4049 100644 --- a/blender/props_ui.py +++ b/blender/props_ui.py @@ -433,7 +433,7 @@ class ArmoryBuildPanel(bpy.types.Panel): layout.prop(wrd, 'arm_build_advanced') if wrd.arm_build_advanced: layout.prop(wrd, 'arm_cache_shaders') - layout.prop(wrd, 'arm_clean_envmaps') + layout.prop(wrd, 'arm_cache_envmaps') layout.prop(wrd, 'arm_minimize') layout.prop(wrd, 'arm_optimize_mesh') layout.prop(wrd, 'arm_sampled_animation')