Reflection cubemap pass
This commit is contained in:
parent
fe9fa0eea9
commit
9e7ac66160
51
Shaders/probe_cubemap/probe_cubemap.frag.glsl
Normal file
51
Shaders/probe_cubemap/probe_cubemap.frag.glsl
Normal 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;
|
||||
}
|
37
Shaders/probe_cubemap/probe_cubemap.json
Normal file
37
Shaders/probe_cubemap/probe_cubemap.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in a new issue