View source
class InstanceIndirect
package h3d.shader
extends InstanceIndirectBase › Shader
@:directlyUsed@:src({ @param var radius:Float; @param var materialCount:Int; @param var lodCount:Int = 1; function getLodCount():Int { return lodCount; }; function main() { if (invocID < instanceCount) { var pos = vec3(0) * modelView.mat3x4(); var vScale = abs(vec3(1) * modelView.mat3x4() - pos); var scaledRadius = max(max(vScale.x, vScale.y), vScale.z); var toCam = camera.position - pos.xyz; var distToCam = length(toCam); scaledRadius *= radius; var culled = dot(scaledRadius, scaledRadius) < 1e-6; culled = culled || frustumCulling(pos, scaledRadius); culled = culled || distanceClipping(distToCam, scaledRadius); var computeScreenRatio = computeScreenRatio(distToCam, scaledRadius); culled = culled || screenRatioCulling(computeScreenRatio); if (ENABLE_COUNT_BUFFER) { if (!culled) { var id = atomicAdd(countBuffer, 0, 1); for (i in 0 ... materialCount) { matID = i * lodCount; var lod = selectLod(computeScreenRatio, lodCount); var matInfo = ivec4(matInfos[lod + matID]); var instanceID = id + i * instanceCount; emitInstance(instanceID, matInfo.x, 1, matInfo.y, 0, invocID); }; }; } else { if (!culled) { for (i in 0 ... materialCount) { matID = i * lodCount; var lod = selectLod(computeScreenRatio, lodCount); var matInfo = ivec4(matInfos[lod + matID]); var instanceID = invocID + i * instanceCount; emitInstance(instanceID, matInfo.x, 1, matInfo.y, 0, invocID); }; } else { for (i in 0 ... materialCount) { var instanceID = invocID + i * instanceCount; emitInstance(instanceID, 0, 0, 0, 0, 0); }; }; }; }; }; })@:build(hxsl.Macros.buildShader())@:autoBuild(hxsl.Macros.buildShader())Constructor
Variables
Methods
Inherited Variables
Inherited Methods
Defined by InstanceIndirectBase
Defined by Shader
setPriority(v:Int):Void
Shader priority should only be changed before the shader is added to a material.