/// <summary>
        /// Run Culling With Compute Shader
        /// </summary>
        /// <param name="view"></param> World To View Matrix
        /// <param name="proj"></param> View To NDC Matrix
        /// <param name="buffers"></param> Buffers
        public static void RunCulling(ref Matrix4x4 view, ref Matrix4x4 proj, ref Matrix4x4 rtProj, ref CullingBuffers buffers)
        {
            Matrix4x4 vp = proj * view;

            buffers.cullingShader.SetMatrix(ShaderIDs._VPMatrix, rtProj * view);
            GetCullingPlanes(ref vp, planes);
            for (int i = 0; i < 6; ++i)
            {
                Vector3 normal   = planes[i].normal;
                float   distance = planes[i].distance;
                planesVector[i] = new Vector4(normal.x, normal.y, normal.z, distance);
            }
            buffers.cullingShader.SetVectorArray(ShaderIDs.planes, planesVector);
            ComputeShaderUtility.Dispatch(buffers.cullingShader, buffers.csmainKernel, buffers.count, THREADGROUPCOUNT);
            buffers.currentCullingResult = (int)GetCullingBufferResult(ref buffers);
        }
Esempio n. 2
0
File: mc.cs Progetto: abarabone/mc
            public MeshResources(MarchingCubeAsset asset, int maxGridLength) : this()
            {
                this.ArgsBufferForInstancing = ComputeShaderUtility.CreateIndirectArgumentsBufferForInstancing();
                this.ArgsBufferForDispatch   = ComputeShaderUtility.CreateIndirectArgumentsBufferForDispatch();

                this.CubeInstancesBuffer = createCubeIdInstancingShaderBuffer_(32 * 32 * 32 * maxGridLength);
                this.GridCubeIdBuffer    = createGridCubeIdShaderBuffer_(maxGridLength);

                var vertexNormalDict = makeVertexNormalsDict_(asset.CubeIdAndVertexIndicesList); Debug.Log(vertexNormalDict.Count);

                this.NormalBuffer      = createNormalList_(vertexNormalDict);
                this.CubePatternBuffer = createCubePatternBuffer_(asset.CubeIdAndVertexIndicesList, vertexNormalDict);
                this.CubeVertexBuffer  = createCubeVertexBuffer_(asset.BaseVertexList);
                this.GridBuffer        = createGridShaderBuffer_(512);

                this.mesh = createMesh_();
            }
 public static void RunCullDispatching(ref PipelineBaseBuffer baseBuffer, ComputeShader computeShader)
 {
     computeShader.Dispatch(1, 1, 1, 1);
     ComputeShaderUtility.Dispatch(computeShader, 0, baseBuffer.clusterCount, 64);
 }
Esempio n. 4
0
        void Awake()
        {
            var em = World.DefaultGameObjectInjectionWorld.EntityManager;


            var drawModelArchetype = em.CreateArchetype(
                typeof(DrawModel.BoneVectorSettingData),
                typeof(DrawModel.InstanceCounterData),
                typeof(DrawModel.VectorBufferData),
                typeof(DrawModel.GeometryData),
                typeof(DrawModel.ComputeArgumentsBufferData)
                );

            this.PrefabEntities = this.PrefabGameObjects
                                  //.Select( prefab => prefab.Convert( em, drawMeshCsResourceHolder, initDrawModelComponents_ ) )
                                  .Select(prefab => prefab.Convert(em, initDrawModelComponents_))
                                  .ToArray();

            return;


            Entity initDrawModelComponents_(Mesh mesh, Material mat, BoneType BoneType, int boneLength)
            {
                // キャプチャ(暫定)
                var em_ = em;
                var drawModelArchetype_ = drawModelArchetype;

                var sys = em.World.GetExistingSystem <DrawBufferManagementSystem>();
                var boneVectorBuffer = sys.GetSingleton <DrawSystem.ComputeTransformBufferData>().Transforms;

                setShaderProps_(mat, mesh, boneVectorBuffer, boneLength);

                return(createEntityAndInitComponents_(drawModelArchetype_, boneLength));


                void setShaderProps_(Material mat_, Mesh mesh_, ComputeBuffer boneVectorBuffer_, int boneLength_)
                {
                    mat_.SetBuffer("BoneVectorBuffer", boneVectorBuffer_);
                    mat_.SetInt("BoneLengthEveryInstance", boneLength_);
                    //mat_.SetInt( "BoneVectorOffset", 0 );// 毎フレームのセットが必要
                }

                Entity createEntityAndInitComponents_(EntityArchetype drawModelArchetype__, int boneLength_)
                {
                    //var drawModelArchetype = em.CreateArchetype(
                    //    typeof( DrawModelBoneInfoData ),
                    //    typeof( DrawModelInstanceCounterData ),
                    //    typeof( DrawModelInstanceOffsetData ),
                    //    typeof( DrawModelMeshData ),
                    //    typeof( DrawModelComputeArgumentsBufferData )
                    //);
                    var ent = em.CreateEntity(drawModelArchetype__);

                    em.SetComponentData(ent,
                                        new DrawModel.BoneVectorSettingData
                    {
                        BoneLength         = boneLength_,
                        VectorLengthInBone = (int)BoneType,
                    }
                                        );
                    em.SetComponentData(ent,
                                        new DrawModel.GeometryData
                    {
                        Mesh     = mesh,
                        Material = mat,
                    }
                                        );
                    em.SetComponentData(ent,
                                        new DrawModel.ComputeArgumentsBufferData
                    {
                        InstanceArgumentsBuffer = ComputeShaderUtility.CreateIndirectArgumentsBuffer(),
                    }
                                        );

                    return(ent);
                }
            }
        }
Esempio n. 5
0
        static public Entity CreateDrawModelEntityComponents
        (
            this GameObjectConversionSystem gcs, GameObject topGameObject,
            Mesh mesh, Material mat,
            BoneType boneType, int boneLength, int instanceDataVectorLength = 0
        )
        {
            var em = gcs.DstEntityManager;

            setShaderProps_(em, mat, mesh, boneLength);

            var drawModelEntity = createDrawModelEntity_(gcs, topGameObject);

            initInfomationData_(em, drawModelEntity, mesh.bounds, boneLength, boneType, instanceDataVectorLength);
            initResourceData_(em, drawModelEntity, mat, mesh);

            return(drawModelEntity);



            void setShaderProps_(EntityManager em_, Material mat_, Mesh mesh_, int boneLength_)
            {
                var sys = em_.World.GetExistingSystem <DrawBufferManagementSystem>();
                var boneVectorBuffer = sys.GetSingleton <DrawSystem.ComputeTransformBufferData>().Transforms;

                mat_.SetBuffer("BoneVectorBuffer", boneVectorBuffer);

                mat_.SetInt("BoneLengthEveryInstance", boneLength_);

                //mat_.SetInt( "BoneVectorOffset", 0 );// 毎フレームのセットが必要なので、ここではやらない
            }

            Entity createDrawModelEntity_
                (GameObjectConversionSystem gcs_, GameObject top_)
            {
                var em_ = gcs_.DstEntityManager;


                var drawModelArchetype = em_.CreateArchetype(
                    typeof(DrawModel.BoneVectorSettingData),
                    typeof(DrawModel.InstanceCounterData),
                    typeof(DrawModel.VectorBufferData),
                    typeof(DrawModel.VectorLengthData),
                    typeof(DrawModel.BoundingBoxData),
                    typeof(DrawModel.GeometryData),
                    typeof(DrawModel.ComputeArgumentsBufferData)
                    );
                var ent = em_.CreateEntity(drawModelArchetype);

                gcs.AddToModelEntityDictionary(top_, ent);


                em_.SetName_(ent, $"{top_.name} model");

                return(ent);
            }

            void initInfomationData_
            (
                EntityManager em_, Entity ent_,
                Bounds bbox_, int boneLength_, BoneType boneType_, int instanceDataVectorLength_
            )
            {
                em_.SetComponentData(ent_,
                                     new DrawModel.BoneVectorSettingData
                {
                    BoneLength         = boneLength_,
                    VectorLengthInBone = (int)boneType_,
                }
                                     );
                em_.SetComponentData(ent_,
                                     new DrawModel.BoundingBoxData
                {
                    LocalBbox = new AABB
                    {
                        Center  = (float3)bbox_.center,   // + meshpos_,
                        Extents = (float3)bbox_.extents,
                    }
                }
                                     );
                em_.SetComponentData(ent_,
                                     new DrawModel.VectorLengthData
                {
                    VectorLengthOfInstanceAdditionalData = instanceDataVectorLength_,
                    VecotrLengthPerInstance = (int)boneType_ * boneLength_ + instanceDataVectorLength_,
                }
                                     );
                Debug.Log($"{boneType_} {boneLength_} {instanceDataVectorLength_}");
            }

            void initResourceData_
                (EntityManager em_, Entity ent_, Material mat_, Mesh mesh_)
            {
                em_.SetComponentData(ent_,
                                     new DrawModel.GeometryData
                {
                    Mesh     = mesh_,
                    Material = mat_,
                }
                                     );
                em_.SetComponentData(ent_,
                                     new DrawModel.ComputeArgumentsBufferData
                {
                    InstanceArgumentsBuffer = ComputeShaderUtility.CreateIndirectArgumentsBuffer(),
                }
                                     );
            }
        }
Esempio n. 6
0
 private static void Dispatch(ref RainData data)
 {
     ComputeShaderUtility.Dispatch(data.settingData.randomDrawShader, 0, data.shaderData.instancingBuffer.count, THREADGROUPCOUNT);
 }