View source
class Slides
package h3d.shader.pbr
extends ScreenShader › Shader
@:directlyUsed@:src({ var albedo:Vec3; var depth:Float; var normal:Vec3; var metalness:Float; var roughness:Float; var occlusion:Float; var emissive:Float; var custom1:Float = 0.0; var custom2:Float = 0.0; @param var shadowMap:Channel; @param var shadowMapCube:SamplerCube; @param var velocity:Sampler2D; @param var translucencyMap:Sampler2D; @const var shadowIsCube:Bool; @const var smode:Int; @const var HAS_VELOCITY:Bool; @const var HAS_TRANSLUCENCY:Bool; var transformedPosition:Vec3; @global var camera:{ var view : Mat4; var viewProj : Mat4}; @const var HAS_CLUSTERS:Bool; @param var clusterData:StorageBuffer<Int>; @param var clusterZParams:Vec2; @param var clearDepth:Float; @param var sceneColor:Sampler2D; var CLUSTER_X:Int = 16; var CLUSTER_Y:Int = 9; var CLUSTER_Z:Int = 24; var CLUSTER_STRIDE:Int = 128; var CLUSTER_HEAT_MAX:Float = 32.0; function heat(t:Float):Vec3 { var j = 0.125 + saturate(t) * 0.75; return saturate(vec3(1.5 - abs(4.0 * j - 3.0), 1.5 - abs(4.0 * j - 2.0), 1.5 - abs(4.0 * j - 1.0))); }; function clusterColor():Vec3 { var gray = vec3(dot(sceneColor.get(calculatedUV).rgb, vec3(0.299, 0.587, 0.114)) * 0.4); var color = gray; if (HAS_CLUSTERS) { var p = vec4(transformedPosition, 1.) * camera.viewProj; var grid = (p.xy / p.w * 0.5 + 0.5) * vec2(float(CLUSTER_X), float(CLUSTER_Y)); var tile = clamp(floor(grid), vec2(0.), vec2(float(CLUSTER_X - 1), float(CLUSTER_Y - 1))); var viewZ = (transformedPosition * camera.view.mat3x4()).z; var slice = clamp(floor(log(max(viewZ, 1e-6)) * clusterZParams.x + clusterZParams.y), 0., float(CLUSTER_Z - 1)); var counts = clusterData[((int(slice) * CLUSTER_Y + int(tile.y)) * CLUSTER_X + int(tile.x)) * CLUSTER_STRIDE]; var count = (counts & 0xFF) + ((counts >> 8) & 0xFF) + ((counts >> 16) & 0xFF) + ((counts >> 24) & 0xFF); if (count >= CLUSTER_STRIDE - 1) color = vec3(1., 0., 1.) else if (count > 0) color = mix(gray, heat(float(count) / CLUSTER_HEAT_MAX), 0.75); var edge = abs(fract(grid) - 0.5); if (max(edge.x, edge.y) > 0.48) color = vec3(0.5); }; return color; }; function getColor(x:Float, y:Float):Vec3 { var color:Vec3; if (y < 1) { if (x < 1) color = albedo.sqrt() else if (x < 2) color = packNormal(normal).rgb else color = depth.xxx; } else if (y < 2) { if (x < 1) color = metalness.xxx else if (x < 2) color = roughness.xxx else if (x < 3) color = occlusion.xxx; } else if (y < 3) { if (x < 1) color = vec3(emissive, custom1, custom2) else if (x < 2) { var uv = vec2(x - 1, y - 2); if (shadowIsCube) { var phi = (1 - uv.x) * 3.1415 * 2; var theta = (-uv.y + 0.5) * 3.1415; var dir = vec3(cos(phi) * cos(theta), sin(phi) * cos(theta), sin(theta)); color = shadowMapCube.get(dir).xxx; } else color = shadowMap.get(uv).xxx; } else if (HAS_VELOCITY) { color = vec3(abs(velocity.get(input.uv).xy) * 100.0, 0.0); }; } else { if (x < 1) { if (HAS_TRANSLUCENCY) color = translucencyMap.get(vec2(x, y - 3)).rgb; } else if (x < 2) color = clusterColor(); }; return color; }; function fragment() { var color:Vec3; var x = input.uv.x * 3; var y = input.uv.y * 4; if (smode == 0) color = getColor(x, y) else color = getColor((smode - 1) % 3 + input.uv.x, int((smode - 1) / 3) + input.uv.y); pixelColor = vec4(color, 1.); }; })@:build(hxsl.Macros.buildShader())@:autoBuild(hxsl.Macros.buildShader())Constructor
Variables
Methods
Inherited Variables
Inherited Methods
Defined by ScreenShader
Defined by Shader
setPriority(v:Int):Void
Shader priority should only be changed before the shader is added to a material.
