コード例 #1
0
        public static void CaptureGeoBox(EngineNS.Bricks.HollowMaker.Agent.GeoBox geoBox,
                                         EngineNS.Bricks.HollowMaker.GeomScene.AgentBoxs agentData,
                                         EngineNS.Graphics.CGfxCamera camera,
                                         EngineNS.CRenderContext rc,
                                         UInt32 numElem,
                                         EngineNS.Graphics.RenderPolicy.CGfxRP_SceneCapture rp,
                                         EngineNS.CCommandList cmd,
                                         UInt32 cbIndex,
                                         EngineNS.CConstantBuffer cbuffer,
                                         EngineNS.CGpuBuffer buffer_visible,
                                         EngineNS.CShaderDesc csMain_visible,
                                         EngineNS.CComputeShader cs_visible,
                                         EngineNS.CUnorderedAccessView uav_visible,
                                         EngineNS.CGpuBuffer buffer_setBit,
                                         EngineNS.CShaderDesc csMain_setBit,
                                         EngineNS.CComputeShader cs_setBit,
                                         EngineNS.CUnorderedAccessView uav_setBit,
                                         EngineNS.CComputeShader cs_Clear,
                                         List <EngineNS.Support.BitSet> savedBitsets,
                                         UInt32 textureIdx,
                                         Action <int, EngineNS.Support.CBlobObject, EngineNS.Support.CBlobObject> actionAfterCapturePerDir)
        {
            var cornerPos = geoBox.Box.GetCorners();

            //for(int posIdx = 0; posIdx < cornerPos.Length; posIdx++)
            //{
            //    await CaptureSceneWithPoint(cornerPos[posIdx], world, camera, rc, camDirs, camUps, dataBlobs, picBlobs);
            //}
            cmd.SetComputeShader(cs_visible);
            UInt32[] pUAVInitialCounts = new UInt32[1] {
                1,
            };
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);

            //await CaptureSceneWithPoint(geoBox.Box.GetCenter(), agentData.Mat , camera, rc, camDirs, camUps, numElem/*, dataBlobs, picBlobs*/);
            for (int camIdx = 0; camIdx < 6; camIdx++)
            {
                EngineNS.Support.CBlobObject idBlob  = null;
                EngineNS.Support.CBlobObject picBlob = null;
                EditorCommon.PVSAssist.CaptureWithPoint(geoBox.Box.GetCenter(), agentData.Mat, camera, rc, camDirs[camIdx], camUps[camIdx], numElem, rp, textureIdx, ref idBlob, ref picBlob);

                actionAfterCapturePerDir?.Invoke(camIdx, idBlob, picBlob);
            }

            // gbuffer0
            var blob = new EngineNS.Support.CBlobObject();

            buffer_visible.GetBufferData(rc, blob);
            var idArray = blob.ToUInts();

            // fill uav1, clear uav0
            cmd.SetComputeShader(cs_setBit);
            UInt32[] pUAVInitialCounts1 = new UInt32[1] {
                1,
            };
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(1, uav_setBit, pUAVInitialCounts);
            var cbDesc = new EngineNS.CConstantBufferDesc();

            if (csMain_setBit.GetCBufferDesc(cbIndex, ref cbDesc))
            {
                if (cbDesc.Type == EngineNS.ECBufferRhiType.SIT_CBUFFER)
                {
                    cmd.CSSetConstantBuffer(cbDesc.CSBindPoint, cbuffer);
                }
            }
            cmd.CSDispatch(numElem, 1, 1);

            var blob0 = new EngineNS.Support.CBlobObject();

            buffer_visible.GetBufferData(rc, blob0);
            var visArray = blob0.ToUInts();
            // gbuffer1
            var blob1 = new EngineNS.Support.CBlobObject();

            buffer_setBit.GetBufferData(rc, blob1);
            var idArray1 = blob1.ToBytes();

            var bitSet  = new EngineNS.Support.BitSet();
            var bitSet1 = new EngineNS.Support.BitSet();

            bitSet.Init(numElem * 2, idArray1);
            bitSet1.Init(numElem);
            for (UInt32 e = 0; e < numElem; e++)
            {
                var bit1 = bitSet.IsBit(e * 2 + 0);
                var bit2 = bitSet.IsBit(e * 2 + 1);

                bitSet1.SetBit(e, bit1 || bit2);
            }

            savedBitsets.Add(bitSet1);

            cmd.SetComputeShader(cs_Clear);
            cmd.CSSetUnorderedAccessView(0, uav_visible, pUAVInitialCounts);
            cmd.CSSetUnorderedAccessView(1, uav_setBit, pUAVInitialCounts);
            cmd.CSDispatch(numElem / 16 + 1, 1, 1);
        }
コード例 #2
0
        public static void ComputeShaderInit(UInt32 numElem,
                                             out UInt32 cbIndex,
                                             out EngineNS.CConstantBuffer cbuffer,
                                             out EngineNS.CGpuBuffer buffer_visible,
                                             out EngineNS.CShaderDesc csMain_visible,
                                             out EngineNS.CComputeShader cs_visible,
                                             out EngineNS.CUnorderedAccessView uav_visible,
                                             out EngineNS.CGpuBuffer buffer_setBit,
                                             out EngineNS.CShaderDesc csMain_setBit,
                                             out EngineNS.CComputeShader cs_setBit,
                                             out EngineNS.CUnorderedAccessView uav_setBit,
                                             out EngineNS.CShaderDesc csMain_Clear,
                                             out EngineNS.CComputeShader cs_Clear,
                                             out UInt32 textureIdx)
        {
            var rc = EngineNS.CEngine.Instance.RenderContext;

            const string CSVersion   = "cs_5_0";
            var          macros      = new EngineNS.CShaderDefinitions();
            var          shaderFile  = EngineNS.RName.GetRName("Shaders/Compute/extractID.compute").Address;
            var          shaderFile2 = EngineNS.RName.GetRName("Shaders/Compute/calcrate.compute").Address;
            var          shaderFile3 = EngineNS.RName.GetRName("Shaders/Compute/clearid.compute").Address;

            csMain_visible = rc.CompileHLSLFromFile(shaderFile, "CSMain", CSVersion, macros, EngineNS.CIPlatform.Instance.PlatformType);
            csMain_setBit  = rc.CompileHLSLFromFile(shaderFile2, "CSMain1", CSVersion, macros, EngineNS.CIPlatform.Instance.PlatformType);
            csMain_Clear   = rc.CompileHLSLFromFile(shaderFile3, "CSMain_Clear", CSVersion, macros, EngineNS.CIPlatform.Instance.PlatformType);
            cs_visible     = rc.CreateComputeShader(csMain_visible);
            cs_setBit      = rc.CreateComputeShader(csMain_setBit);
            cs_Clear       = rc.CreateComputeShader(csMain_Clear);

            var bfDesc = new EngineNS.CGpuBufferDesc();

            bfDesc.SetMode(false, true);
            bfDesc.ByteWidth           = 4 * numElem;
            bfDesc.StructureByteStride = 4;
            buffer_visible             = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);
            var uavDesc = new EngineNS.CUnorderedAccessViewDesc();

            uavDesc.ToDefault();
            uavDesc.Buffer.NumElements = numElem;
            uav_visible = rc.CreateUnorderedAccessView(buffer_visible, uavDesc);

            // 一个uint保存16个actorID的权重
            var numElemUAV1 = numElem / 16 + 1;

            bfDesc.ByteWidth           = 4 * numElemUAV1;
            bfDesc.StructureByteStride = 4;
            buffer_setBit = rc.CreateGpuBuffer(bfDesc, IntPtr.Zero);
            uavDesc.Buffer.NumElements = numElemUAV1;
            uav_setBit = rc.CreateUnorderedAccessView(buffer_setBit, uavDesc);

            cbIndex = csMain_setBit.FindCBufferDesc("CaptureEnv");
            cbuffer = null;
            if ((int)cbIndex != -1)
            {
                cbuffer = rc.CreateConstantBuffer(csMain_setBit, cbIndex);

                var varIdx = cbuffer.FindVar("rateWeight");
                cbuffer.SetValue(varIdx, new EngineNS.Quaternion(1, 1, 10000, 100000), 0);
                cbuffer.FlushContent(rc.ImmCommandList);
            }

            textureIdx = csMain_visible.FindSRVDesc("SrcTexture");
        }