int UpdateBuffers(int renderIndex) { ClearMatrixBuffer(renderIndex); processable.SetFilter(new SpriteSheetMaterial { material = renderInfos[renderIndex].material }); NativeArray <RenderData> data = processable.ToComponentDataArray <RenderData>(Allocator.TempJob); int instanceCount = data.Length; if (instanceCount > 0) { NativeArray <float4x2> matrix = new NativeArray <float4x2>(instanceCount, Allocator.TempJob); var job = new CalculateMatrixJob() { datas = data, matrix = matrix }; JobHandle jobHandle = job.Schedule(); jobHandle.Complete(); renderInfos[renderIndex].matrixBuffer = new ComputeBuffer(instanceCount, 32); renderInfos[renderIndex].matrixBuffer.SetData(job.matrix); renderInfos[renderIndex].material.SetBuffer("matrixBuffer", renderInfos[renderIndex].matrixBuffer); renderInfos[renderIndex].args[1] = (uint)instanceCount; renderInfos[renderIndex].argsBuffer.SetData(renderInfos[renderIndex].args); matrix.Dispose(); } data.Dispose(); return(instanceCount); }
public override void PreRenderFrame(PipelineCamera cam, ref PipelineCommandData data) { if (!cam.cam.TryGetCullingParameters(out cullParams)) { return; } data.buffer.SetInvertCulling(cam.inverseRender); cullParams.reflectionProbeSortingCriteria = ReflectionProbeSortingCriteria.ImportanceThenSize; cullParams.cullingOptions = CullingOptions.NeedsLighting | CullingOptions.NeedsReflectionProbes; if (cam.cam.useOcclusionCulling) { cullParams.cullingOptions |= CullingOptions.OcclusionCull; } cullResults = data.context.Cull(ref cullParams); for (int i = 0; i < frustumPlanes.Length; ++i) { Plane p = cullParams.GetCullingPlane(i); //GPU Driven RP's frustum plane is inverse from SRP's frustum plane frustumPlanes[i] = new Vector4(-p.normal.x, -p.normal.y, -p.normal.z, -p.distance); } PipelineFunctions.InitRenderTarget(ref cam.targets, cam.cam, data.buffer); lastData = IPerCameraData.GetProperty(cam, getLastVP); calculateJob = new CalculateMatrixJob { isD3D = GraphicsUtility.platformIsD3D, nonJitterP = cam.cam.nonJitteredProjectionMatrix, worldToView = cam.cam.worldToCameraMatrix, lastVP = lastData.lastVP, rand = (Random *)UnsafeUtility.AddressOf(ref rand), p = cam.cam.projectionMatrix, VP = (float4x4 *)UnsafeUtility.AddressOf(ref VP), inverseVP = (float4x4 *)UnsafeUtility.AddressOf(ref inverseVP) }; handle = calculateJob.ScheduleRefBurst(); }