From 5cca22fcfc90daaf7468c2209b8acfbd1cba153b Mon Sep 17 00:00:00 2001 From: Lubos Lenco Date: Wed, 20 May 2020 13:18:22 +0200 Subject: [PATCH] Add support for rotating envmap --- Assets/painter/deferred_light.arm | Bin 3532 -> 3682 bytes Assets/painter/keymap_presets/blender.json | 3 ++- Assets/painter/keymap_presets/default.json | 1 + Assets/painter/world_pass.arm | Bin 640 -> 714 bytes .../Sources/arm/node/MaterialFunctions.hx | 4 ++-- .../Shaders/src/raytrace_bake_light.hlsl | 4 ++-- .../xenon/Shaders/src/raytrace_brute.hlsl | 4 ++-- Libraries/xenon/Shaders/src/std/math.hlsl | 4 ++-- .../Sources/arm/render/RenderPathRaytrace.hx | 3 ++- Shaders/creator/deferred_light.frag.glsl | 2 +- .../creator/deferred_light_voxel.frag.glsl | 2 +- Shaders/creator/water_pass.frag.glsl | 2 +- Shaders/creator/world_pass.frag.glsl | 5 +---- Shaders/painter/deferred_light.frag.glsl | 3 ++- .../painter/deferred_light_voxel.frag.glsl | 3 ++- Shaders/painter/world_pass.frag.glsl | 3 ++- Shaders/std/math.glsl | 4 ++-- Sources/arm/Context.hx | 1 + Sources/arm/node/MakeMesh.hx | 3 ++- Sources/arm/render/Uniforms.hx | 3 +++ 20 files changed, 31 insertions(+), 23 deletions(-) diff --git a/Assets/painter/deferred_light.arm b/Assets/painter/deferred_light.arm index 8831411da6716fa75ba526b4ea6b3e522b3dae52..67a0c81f644fe1f418a68094e8ff2d564d9ac38e 100644 GIT binary patch delta 123 zcmX>j{YYj)3!}iq)<2UC7=<;t85kH+^U87)3mo&(b5d`!0QotYdD*vlfQ)z~na%Ya S_n9^avN$j^@{yz2mlXiJS0|(Z delta 33 kcmaDPb4GeX3nTyJyX=29pJ5bWW8{T0FEDNX!kxzi0P+wH2mk;8 diff --git a/Assets/painter/keymap_presets/blender.json b/Assets/painter/keymap_presets/blender.json index d05dae19..ff0c56da 100644 --- a/Assets/painter/keymap_presets/blender.json +++ b/Assets/painter/keymap_presets/blender.json @@ -3,7 +3,8 @@ "action_rotate": "middle", "action_pan": "shift+middle", "action_zoom": "ctrl+middle", - "rotate_light": "shift+middle", + "rotate_light": "shift+right", + "rotate_envmap": "ctrl+right", "set_clone_source": "alt", "stencil_transform": "ctrl", "stencil_hide": "z", diff --git a/Assets/painter/keymap_presets/default.json b/Assets/painter/keymap_presets/default.json index 89363e19..b7bdbc14 100644 --- a/Assets/painter/keymap_presets/default.json +++ b/Assets/painter/keymap_presets/default.json @@ -4,6 +4,7 @@ "action_pan": "alt+middle", "action_zoom": "alt+right", "rotate_light": "shift+middle", + "rotate_envmap": "ctrl+middle", "set_clone_source": "alt", "stencil_transform": "ctrl", "stencil_hide": "z", diff --git a/Assets/painter/world_pass.arm b/Assets/painter/world_pass.arm index 0297305f60d3e5e7266a1616be416767c17c5e51..724e0712aab7a6a0ceee932f01ea8e91a1d90b64 100644 GIT binary patch delta 61 zcmZo*J;geqjFEX_`OJy?l{C2-7#LFX%5oD69P`q1Qg5>W`8k<+*|&LsjCdrO%>s=1 Fi~wi_6Nvx- delta 18 ZcmX@b+Q2%YjFD+#`OMAHjQNa=3;;Y-1%Chl diff --git a/Libraries/nodelib/Sources/arm/node/MaterialFunctions.hx b/Libraries/nodelib/Sources/arm/node/MaterialFunctions.hx index b6324eae..057aeece 100644 --- a/Libraries/nodelib/Sources/arm/node/MaterialFunctions.hx +++ b/Libraries/nodelib/Sources/arm/node/MaterialFunctions.hx @@ -377,11 +377,11 @@ void createBasis(vec3 normal, out vec3 tangent, out vec3 binormal) { #end public static var str_envMapEquirect = " -vec2 envMapEquirect(const vec3 normal) { +vec2 envMapEquirect(const vec3 normal, const float angle) { const float PI = 3.1415926535; const float PI2 = PI * 2.0; float phi = acos(normal.z); - float theta = atan(-normal.y, normal.x) + PI; + float theta = atan(-normal.y, normal.x) + PI + angle; return vec2(theta / PI2, phi / PI); } "; diff --git a/Libraries/xenon/Shaders/src/raytrace_bake_light.hlsl b/Libraries/xenon/Shaders/src/raytrace_bake_light.hlsl index 604ceca8..8ce19fed 100644 --- a/Libraries/xenon/Shaders/src/raytrace_bake_light.hlsl +++ b/Libraries/xenon/Shaders/src/raytrace_bake_light.hlsl @@ -12,7 +12,7 @@ struct Vertex { struct RayGenConstantBuffer { float4 v0; // frame, strength, radius, offset - float4 v1; // envstr + float4 v1; // envstr, upaxis, envangle float4 v2; float4 v3; float4 v4; @@ -113,7 +113,7 @@ void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttribut [shader("miss")] void miss(inout RayPayload payload) { - float2 tex_coord = equirect(WorldRayDirection()); + float2 tex_coord = equirect(WorldRayDirection(), constant_buffer.v1.z); uint2 size; mytexture_env.GetDimensions(size.x, size.y); float3 texenv = mytexture_env.Load(uint3(tex_coord * size, 0)).rgb * constant_buffer.v1.x; diff --git a/Libraries/xenon/Shaders/src/raytrace_brute.hlsl b/Libraries/xenon/Shaders/src/raytrace_brute.hlsl index 2c8c3d62..881fd0a3 100644 --- a/Libraries/xenon/Shaders/src/raytrace_brute.hlsl +++ b/Libraries/xenon/Shaders/src/raytrace_brute.hlsl @@ -13,7 +13,7 @@ struct Vertex { struct RayGenConstantBuffer { float4 eye; // xyz, frame float4x4 inv_vp; - float4 params; // envstr + float4 params; // envstr, envangle }; struct RayPayload { @@ -216,7 +216,7 @@ void miss(inout RayPayload payload) { } #endif - float2 tex_coord = equirect(WorldRayDirection()); + float2 tex_coord = equirect(WorldRayDirection(), constant_buffer.params.y); uint2 size; mytexture_env.GetDimensions(size.x, size.y); float3 texenv = mytexture_env.Load(uint3(tex_coord * size, 0)).rgb * abs(constant_buffer.params.x); diff --git a/Libraries/xenon/Shaders/src/std/math.hlsl b/Libraries/xenon/Shaders/src/std/math.hlsl index 437062ff..a97cf188 100644 --- a/Libraries/xenon/Shaders/src/std/math.hlsl +++ b/Libraries/xenon/Shaders/src/std/math.hlsl @@ -29,11 +29,11 @@ void generate_camera_ray(float2 screen_pos, out float3 ray_origin, out float3 ra ray_dir = normalize(world.xyz - ray_origin); } -float2 equirect(float3 normal) { +float2 equirect(float3 normal, float angle) { const float PI = 3.1415926535; const float PI2 = PI * 2.0; float phi = acos(normal.z); - float theta = atan2(-normal.y, normal.x) + PI; + float theta = atan2(-normal.y, normal.x) + PI + angle; return float2(theta / PI2, phi / PI); } diff --git a/Libraries/xenon/Sources/arm/render/RenderPathRaytrace.hx b/Libraries/xenon/Sources/arm/render/RenderPathRaytrace.hx index 40dda030..c56fa7cb 100644 --- a/Libraries/xenon/Sources/arm/render/RenderPathRaytrace.hx +++ b/Libraries/xenon/Sources/arm/render/RenderPathRaytrace.hx @@ -85,7 +85,7 @@ class RenderPathRaytrace { f32[19] = helpMat._33; f32[20] = Scene.active.world.probe.raw.strength; if (!Context.showEnvmap) f32[20] = -f32[20]; - // f32[21] = Context.showEnvmap ? 1.0 : 0.0; + f32[21] = Context.envmapAngle; // var right = cam.rightWorld().normalize(); // f32[21] = right.x; // f32[22] = right.y; @@ -190,6 +190,7 @@ class RenderPathRaytrace { f32[3] = Context.bakeAoOffset; f32[4] = Scene.active.world.probe.raw.strength; f32[5] = Context.bakeUpAxis; + f32[6] = Context.envmapAngle; var framebuffer = path.renderTargets.get("baketex2").image; Krom.raytraceDispatchRays(framebuffer.renderTarget_, f32.buffer); diff --git a/Shaders/creator/deferred_light.frag.glsl b/Shaders/creator/deferred_light.frag.glsl index e83165fd..a56cf967 100644 --- a/Shaders/creator/deferred_light.frag.glsl +++ b/Shaders/creator/deferred_light.frag.glsl @@ -214,7 +214,7 @@ void main() { #ifdef _Rad vec3 reflectionWorld = reflect(-v, n); float lod = getMipFromRoughness(roughness, envmapNumMipmaps); - vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb; + vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld, 0.0), lod).rgb; #endif #ifdef _EnvLDR diff --git a/Shaders/creator/deferred_light_voxel.frag.glsl b/Shaders/creator/deferred_light_voxel.frag.glsl index cfafba0f..8c50a5ab 100644 --- a/Shaders/creator/deferred_light_voxel.frag.glsl +++ b/Shaders/creator/deferred_light_voxel.frag.glsl @@ -218,7 +218,7 @@ void main() { #ifdef _Rad vec3 reflectionWorld = reflect(-v, n); float lod = getMipFromRoughness(roughness, envmapNumMipmaps); - vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb; + vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld, 0.0), lod).rgb; #endif #ifdef _EnvLDR diff --git a/Shaders/creator/water_pass.frag.glsl b/Shaders/creator/water_pass.frag.glsl index 4ada3f37..f3aeebe2 100644 --- a/Shaders/creator/water_pass.frag.glsl +++ b/Shaders/creator/water_pass.frag.glsl @@ -79,7 +79,7 @@ void main() { float fresnel = 1.0 - max(dot(n2, v), 0.0); fresnel = pow(fresnel, 30.0) * 0.45; vec3 r = reflect(-v, n2); - vec3 reflected = textureLod(senvmapRadiance, envMapEquirect(r), 0).rgb; + vec3 reflected = textureLod(senvmapRadiance, envMapEquirect(r, 0.0), 0).rgb; vec3 refracted = textureLod(tex, tc, 0.0).rgb; fragColor.rgb = mix(refracted, reflected, fresnel * waterReflect); fragColor.rgb *= waterColor; diff --git a/Shaders/creator/world_pass.frag.glsl b/Shaders/creator/world_pass.frag.glsl index 13220ee3..ec69dbb6 100644 --- a/Shaders/creator/world_pass.frag.glsl +++ b/Shaders/creator/world_pass.frag.glsl @@ -147,7 +147,7 @@ void main() { #ifndef _EnvSky // Prevent case when sky radiance is enabled #ifdef _EnvTex vec3 n = normalize(normal); - fragColor.rgb = texture(envmap, envMapEquirect(n)).rgb * envmapStrength; + fragColor.rgb = texture(envmap, envMapEquirect(n, 0.0)).rgb * envmapStrength; #ifdef _EnvLDR fragColor.rgb = pow(fragColor.rgb, vec3(2.2)); #endif @@ -162,9 +162,6 @@ void main() { #ifdef _EnvSky vec3 n = normalize(normal); - float phi = acos(n.z); - float theta = atan(-n.y, n.x) + PI; - float cos_theta = clamp(n.z, 0.0, 1.0); float cos_gamma = dot(n, hosekSunDirection); float gamma_val = acos(cos_gamma); diff --git a/Shaders/painter/deferred_light.frag.glsl b/Shaders/painter/deferred_light.frag.glsl index 707ce3a0..e0dc64be 100644 --- a/Shaders/painter/deferred_light.frag.glsl +++ b/Shaders/painter/deferred_light.frag.glsl @@ -45,6 +45,7 @@ uniform vec3 eyeSnap; #endif uniform float envmapStrength; +uniform float envmapAngle; #ifdef _Irr uniform vec4 shirr[7]; #endif @@ -216,7 +217,7 @@ void main() { #ifdef _Rad vec3 reflectionWorld = reflect(-v, n); float lod = getMipFromRoughness(roughness, envmapNumMipmaps); - vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb; + vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld, envmapAngle), lod).rgb; #endif #ifdef _EnvLDR diff --git a/Shaders/painter/deferred_light_voxel.frag.glsl b/Shaders/painter/deferred_light_voxel.frag.glsl index 19035991..2ebd9e0c 100644 --- a/Shaders/painter/deferred_light_voxel.frag.glsl +++ b/Shaders/painter/deferred_light_voxel.frag.glsl @@ -46,6 +46,7 @@ uniform vec3 eyeSnap; #endif uniform float envmapStrength; +uniform float envmapAngle; #ifdef _Irr uniform vec4 shirr[7]; #endif @@ -217,7 +218,7 @@ void main() { #ifdef _Rad vec3 reflectionWorld = reflect(-v, n); float lod = getMipFromRoughness(roughness, envmapNumMipmaps); - vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb; + vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld, envmapAngle), lod).rgb; #endif #ifdef _EnvLDR diff --git a/Shaders/painter/world_pass.frag.glsl b/Shaders/painter/world_pass.frag.glsl index e8b25202..56f3b466 100644 --- a/Shaders/painter/world_pass.frag.glsl +++ b/Shaders/painter/world_pass.frag.glsl @@ -40,6 +40,7 @@ #ifdef _EnvStr uniform float envmapStrength; #endif +uniform float envmapAngle; in vec3 normal; out vec4 fragColor; @@ -137,7 +138,7 @@ void main() { #ifndef _EnvSky // Prevent case when sky radiance is enabled #ifdef _EnvTex vec3 n = normalize(normal); - fragColor.rgb = texture(envmap, envMapEquirect(n)).rgb * envmapStrength; + fragColor.rgb = texture(envmap, envMapEquirect(n, envmapAngle)).rgb * envmapStrength; #ifdef _EnvLDR fragColor.rgb = pow(fragColor.rgb, vec3(2.2)); #endif diff --git a/Shaders/std/math.glsl b/Shaders/std/math.glsl index 2cf86851..94f83cfe 100644 --- a/Shaders/std/math.glsl +++ b/Shaders/std/math.glsl @@ -10,11 +10,11 @@ float hash(const vec2 p) { return fract(sin(h) * 43758.5453123); } -vec2 envMapEquirect(const vec3 normal) { +vec2 envMapEquirect(const vec3 normal, const float angle) { const float PI = 3.1415926535; const float PI2 = PI * 2.0; float phi = acos(normal.z); - float theta = atan(-normal.y, normal.x) + PI; + float theta = atan(-normal.y, normal.x) + PI + angle; return vec2(theta / PI2, phi / PI); } diff --git a/Sources/arm/Context.hx b/Sources/arm/Context.hx index 1c514628..77944ad0 100644 --- a/Sources/arm/Context.hx +++ b/Sources/arm/Context.hx @@ -77,6 +77,7 @@ class Context { public static var showEnvmapHandle = new Handle({selected: false}); public static var showEnvmapBlur = false; public static var showEnvmapBlurHandle = new Handle({selected: false}); + public static var envmapAngle = 0.0; public static var drawWireframe = false; public static var wireframeHandle = new Handle({selected: false}); public static var drawTexels = false; diff --git a/Sources/arm/node/MakeMesh.hx b/Sources/arm/node/MakeMesh.hx index ce56ee81..8ba1e686 100644 --- a/Sources/arm/node/MakeMesh.hx +++ b/Sources/arm/node/MakeMesh.hx @@ -349,10 +349,11 @@ class MakeMesh { frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;'); frag.add_uniform('sampler2D senvmapRadiance', '_envmapRadiance'); frag.add_uniform('int envmapNumMipmaps', '_envmapNumMipmaps'); + frag.add_uniform('float envmapAngle', '_envmapAngle'); frag.write('vec3 wreflect = reflect(-vVec, wn);'); frag.write('float envlod = roughness * float(envmapNumMipmaps);'); frag.add_function(MaterialFunctions.str_envMapEquirect); - frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect), envlod).rgb;'); + frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(wreflect, envmapAngle), envlod).rgb;'); frag.add_uniform('vec3 lightArea0', '_lightArea0'); frag.add_uniform('vec3 lightArea1', '_lightArea1'); diff --git a/Sources/arm/render/Uniforms.hx b/Sources/arm/render/Uniforms.hx index 917d196a..5d9cc275 100644 --- a/Sources/arm/render/Uniforms.hx +++ b/Sources/arm/render/Uniforms.hx @@ -77,6 +77,9 @@ class Uniforms { if (link == "_objectId") { return Project.paintObjects.indexOf(Context.paintObject); } + if (link == "_envmapAngle") { + return Context.envmapAngle; + } #end #if arm_world if (link == "_voxelgiHalfExtentsUni") {