Reflection cubemap pass

This commit is contained in:
luboslenco 2018-10-04 15:35:33 +02:00
parent fe9fa0eea9
commit 9e7ac66160
8 changed files with 114 additions and 38 deletions

View file

@ -0,0 +1,51 @@
#version 450
#include "compiled.inc"
#include "std/gbuffer.glsl"
uniform samplerCube probeTex;
uniform sampler2D gbuffer0;
uniform sampler2D gbuffer1;
uniform mat4 invVP;
// uniform vec3 probep;
uniform vec3 eye;
in vec4 wvpposition;
out vec4 fragColor;
void main() {
vec2 texCoord = wvpposition.xy / wvpposition.w;
texCoord = texCoord * 0.5 + 0.5;
#ifdef _InvY
texCoord.y = 1.0 - texCoord.y;
#endif
vec4 g0 = texture(gbuffer0, texCoord); // Normal.xy, metallic/roughness, depth
float roughness = unpackFloat(g0.b).y;
if (roughness > 0.95) {
fragColor.rgb = vec3(0.0);
return;
}
float spec = fract(texture(gbuffer1, texCoord).a);
if (spec == 0.0) {
fragColor.rgb = vec3(0.0);
return;
}
float depth = (1.0 - g0.a) * 2.0 - 1.0;
vec3 wp = getPos2(invVP, depth, texCoord);
vec2 enc = g0.rg;
vec3 n;
n.z = 1.0 - abs(enc.x) - abs(enc.y);
n.xy = n.z >= 0.0 ? enc.xy : octahedronWrap(enc.xy);
n = normalize(n);
vec3 v = wp - eye;
// float intensity = clamp((1.0 - roughness) * dot(n, proben), 0.0, 1.0);
float intensity = 1.0 - roughness;
fragColor.rgb = texture(probeTex, reflect(v, n)).rgb * intensity;
}

View file

@ -0,0 +1,37 @@
{
"contexts": [
{
"name": "probe_cubemap",
"depth_write": false,
"color_write_alpha": false,
"compare_mode": "less",
"cull_mode": "clockwise",
"blend_source": "blend_one",
"blend_destination": "blend_one",
"blend_operation": "add",
"alpha_blend_source": "blend_one",
"alpha_blend_destination": "blend_one",
"alpha_blend_operation": "add",
"links": [
{
"name": "VWVP",
"link": "_worldViewProjectionMatrix"
},
{
"name": "invVP",
"link": "_inverseViewProjectionMatrix"
},
{
"name": "probep",
"link": "_probePosition"
},
{
"name": "eye",
"link": "_cameraPosition"
}
],
"vertex_shader": "../include/pass_volume.vert.glsl",
"fragment_shader": "probe_cubemap.frag.glsl"
}
]
}

View file

@ -3,7 +3,7 @@
#include "compiled.inc"
#include "std/gbuffer.glsl"
uniform sampler2D planeTex;
uniform sampler2D probeTex;
uniform sampler2D gbuffer0;
uniform sampler2D gbuffer1;
uniform mat4 probeVP;
@ -46,5 +46,5 @@ void main() {
n = normalize(n);
float intensity = clamp((1.0 - roughness) * dot(n, proben), 0.0, 1.0);
fragColor.rgb = texture(planeTex, tc).rgb * intensity;
fragColor.rgb = texture(probeTex, tc).rgb * intensity;
}

View file

@ -419,7 +419,7 @@ class Inc {
#if (rp_renderer == "Forward")
public static function drawShadowMap(l:iron.object.LightObject) {
#if (rp_shadowmap)
var faces = path.getLight(path.currentLightIndex).data.raw.shadowmap_cube ? 6 : 1;
var faces = l.data.raw.shadowmap_cube ? 6 : 1;
for (i in 0...faces) {
if (faces > 1) path.currentFace = i;
path.setTarget(Inc.getShadowMap());
@ -433,8 +433,8 @@ class Inc {
public static function drawShadowMap(l:iron.object.LightObject) {
#if (rp_shadowmap)
var faces = l.data.raw.shadowmap_cube ? 6 : 1;
for (j in 0...faces) {
if (faces > 1) path.currentFace = j;
for (i in 0...faces) {
if (faces > 1) path.currentFace = i;
path.setTarget(Inc.getShadowMap());
path.clearTarget(null, 1.0);
path.drawMeshes("shadowmap");

View file

@ -157,6 +157,8 @@ class RenderPathDeferred {
#if rp_probes
path.loadShader("shader_datas/probe_planar/probe_planar");
path.loadShader("shader_datas/probe_cubemap/probe_cubemap");
path.loadShader("shader_datas/copy_pass/copy_pass");
#end
#if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
@ -595,21 +597,25 @@ class RenderPathDeferred {
path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
}
var isProbe = iron.Scene.active.camera.renderTarget != null;
#if rp_probes
if (!isProbe) {
if (!path.isProbe) {
// TODO: cull
var probes = iron.Scene.active.probes;
for (i in 0...probes.length) {
var p = probes[i];
if (!p.visible) continue;
path.currentProbeIndex = i;
path.setTarget("tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("gbuffer1", "gbuffer1");
path.bindTarget(p.raw.name, "planeTex");
path.drawVolume(p, "shader_datas/probe_planar/probe_planar");
path.bindTarget(p.raw.name, "probeTex");
if (p.data.raw.type == "planar") {
path.drawVolume(p, "shader_datas/probe_planar/probe_planar");
}
else if (p.data.raw.type == "cubemap") {
path.drawVolume(p, "shader_datas/probe_cubemap/probe_cubemap");
}
}
}
#end
@ -876,7 +882,8 @@ class RenderPathDeferred {
#if rp_compositornodes
{
path.drawShader("shader_datas/compositor_pass/compositor_pass");
if (!path.isProbe) path.drawShader("shader_datas/compositor_pass/compositor_pass");
else path.drawShader("shader_datas/copy_pass/copy_pass");
}
#else
{
@ -905,7 +912,7 @@ class RenderPathDeferred {
path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
#if (rp_antialiasing == "TAA")
isProbe ? path.setTarget(framebuffer) : path.setTarget("bufa");
path.isProbe ? path.setTarget(framebuffer) : path.setTarget("bufa");
#else
path.setTarget(framebuffer);
#end
@ -920,7 +927,7 @@ class RenderPathDeferred {
#if (rp_antialiasing == "TAA")
{
if (!isProbe) { // No last frame for probe
if (!path.isProbe) { // No last frame for probe
path.setTarget(framebuffer);
path.bindTarget("bufa", "tex");
path.bindTarget("taa", "tex2");

View file

@ -1,23 +0,0 @@
package armory.trait;
import iron.Trait;
import iron.object.MeshObject;
class CameraTexture extends Trait {
var cameraName:String;
public function new(cameraName:String) {
super();
this.cameraName = cameraName;
iron.Scene.active.notifyOnInit(init);
}
function init() {
var image = iron.Scene.active.getCamera(cameraName).data.renderTarget;
var o = cast(object, iron.object.MeshObject);
o.materials[0].contexts[0].textures[0] = image; // Override diffuse texture
}
}

View file

@ -988,7 +988,8 @@ class ArmoryExporter:
self.probeArray[objref] = {"structName" : objname, "objectTable" : [bobject]}
else:
self.probeArray[objref]["objectTable"].append(bobject)
o['dimensions'] = [1.0, 1.0, bobject.data.influence_distance]
dist = bobject.data.influence_distance
o['dimensions'] = [dist, dist, dist]
o['data_ref'] = self.probeArray[objref]["structName"]
elif type == NodeTypeCamera:
@ -1753,7 +1754,7 @@ class ArmoryExporter:
gapi = arm.utils.get_gapi()
mobile_mat = rpdat.arm_material_model == 'Mobile' or rpdat.arm_material_model == 'Solid'
if objtype == 'POINT' and not mobile_mat:
o['fov'] = 1.5708 # 90 deg
o['fov'] = 1.5708 # pi/2
o['shadowmap_cube'] = True
o['shadows_bias'] *= 2.0

View file

@ -291,8 +291,11 @@ def build():
assets.add_shader_pass('deferred_light_quad')
if bpy.app.version >= (2, 80, 1) and len(bpy.data.lightprobes) > 0:
wrd.world_defs += '_Probes'
assets.add_khafile_def('rp_probes')
assets.add_shader_pass('probe_planar')
assets.add_shader_pass('probe_cubemap')
assets.add_shader_pass('copy_pass')
if rpdat.rp_volumetriclight:
assets.add_khafile_def('rp_volumetriclight')