View source
class BatchCulling
package h3d.scene
extends Shader
import h3d.scene.Batcher
@:directlyUsed@:src({ @global var camera:{ var position : Vec3; var proj : Mat4}; @param var instancesData:StorageBuffer<Vec4>; @param var instancesInfos:RWBuffer<Int>; @param var subMeshInfos:StorageBuffer<Int>; @param var lodInfos:StorageBuffer<Float>; @param var frustum:Buffer<Vec4,6>; @param var shadowMaxDistance:Float; @param var instanceCount:Int; var instanceInfosStride = 2; var subMeshInfosStride = 2; function computeScreenRatio(distToCam:Float, radius:Float):Float { var screenMultiple = max(0.5 * camera.proj[0][0], 0.5 * camera.proj[1][1]); var screenRadius = screenMultiple * radius / max(1.0, distToCam); return 2.0 * screenRadius; }; function main() { setLayout(64, 1, 1); var invocID = computeVar.workGroup.x * 64 + computeVar.localInvocationIndex; if (invocID >= instanceCount) return; var instancePos = invocID * instanceInfosStride; var subMeshID:Int = instancesInfos[instancePos + 0]; var subMeshPos = subMeshID * subMeshInfosStride; var data = instancesData[invocID]; var position = data.xyz; var boundingSphere = data.w; var lodStart:Int = subMeshInfos[subMeshPos + 0]; var lodCount:Int = subMeshInfos[subMeshPos + 1]; var mainCulled = false; @unroll for (i in 0 ... 6) { var plane = frustum[i]; mainCulled = mainCulled || ((dot(plane.xyz, position) - plane.w) < -boundingSphere); }; var toCam = camera.position - position.xyz; var distToCam = length(toCam); var screenRatio = computeScreenRatio(distToCam, boundingSphere); var lodSelected:Int = 0; for (i in 0 ... lodCount) { var minScreenRatio = lodInfos[lodStart + i]; if (screenRatio > minScreenRatio) break; lodSelected++; }; var shadowCulled = shadowMaxDistance > 0 && shadowMaxDistance < distToCam; var cullingMask:Int = 0; cullingMask |= mainCulled ? 1 << 0 : 0; cullingMask |= shadowCulled ? 1 << 1 : 0; cullingMask |= lodCount == lodSelected ? 3 : 0; var flags:Int = 0; flags |= lodSelected << 8; flags |= cullingMask & 0xFF; instancesInfos[instancePos + 1] = flags; }; })@:build(hxsl.Macros.buildShader())@:autoBuild(hxsl.Macros.buildShader())Constructor
Variables
Methods
Inherited Variables
Inherited Methods
Defined by Shader
setPriority(v:Int):Void
Shader priority should only be changed before the shader is added to a material.
