Пример #1
0
    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();
 }