public ProjectionMappingSample(string[] args) { // load ensemble.xml string path = args[0]; string directory = Path.GetDirectoryName(path); ensemble = RoomAliveToolkit.ProjectorCameraEnsemble.FromFile(path); // create d3d device var factory = new Factory1(); var adapter = factory.Adapters[0]; // When using DeviceCreationFlags.Debug on Windows 10, ensure that "Graphics Tools" are installed via Settings/System/Apps & features/Manage optional features. // Also, when debugging in VS, "Enable native code debugging" must be selected on the project. device = new SharpDX.Direct3D11.Device(adapter, DeviceCreationFlags.None); // shaders depthAndColorShader = new DepthAndColorShader(device); projectiveTexturingShader = new ProjectiveTexturingShader(device); passThroughShader = new PassThrough(device, userViewTextureWidth, userViewTextureHeight); radialWobbleShader = new RadialWobble(device, userViewTextureWidth, userViewTextureHeight); meshShader = new MeshShader(device); fromUIntPS = new FromUIntPS(device, Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight); bilateralFilter = new BilateralFilter(device, Kinect2Calibration.depthImageWidth, Kinect2Calibration.depthImageHeight); // create device objects for each camera foreach (var camera in ensemble.cameras) { cameraDeviceResources[camera] = new CameraDeviceResource(device, camera, renderLock, directory); } // one user view // user view render target, depth buffer, viewport for user view var userViewTextureDesc = new Texture2DDescription() { Width = userViewTextureWidth, Height = userViewTextureHeight, MipLevels = 1, // revisit this; we may benefit from mipmapping? ArraySize = 1, Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm, SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.RenderTarget | BindFlags.ShaderResource, CpuAccessFlags = CpuAccessFlags.None, }; var userViewRenderTarget = new Texture2D(device, userViewTextureDesc); userViewRenderTargetView = new RenderTargetView(device, userViewRenderTarget); userViewSRV = new ShaderResourceView(device, userViewRenderTarget); var filteredUserViewRenderTarget = new Texture2D(device, userViewTextureDesc); filteredUserViewRenderTargetView = new RenderTargetView(device, filteredUserViewRenderTarget); filteredUserViewSRV = new ShaderResourceView(device, filteredUserViewRenderTarget); // user view depth buffer var userViewDpethBufferDesc = new Texture2DDescription() { Width = userViewTextureWidth, Height = userViewTextureHeight, MipLevels = 1, ArraySize = 1, Format = Format.D32_Float, // necessary? SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None }; var userViewDepthStencil = new Texture2D(device, userViewDpethBufferDesc); userViewDepthStencilView = new DepthStencilView(device, userViewDepthStencil); // user view viewport userViewViewport = new Viewport(0, 0, userViewTextureWidth, userViewTextureHeight, 0f, 1f); // create a form for each projector foreach (var projector in ensemble.projectors) { var form = new ProjectorForm(factory, device, renderLock, projector); if (fullScreenEnabled) { form.FullScreen = fullScreenEnabled; // TODO: fix this so can be called after Show } form.Show(); projectorForms.Add(form); } // example 3d object var mesh = Mesh.FromOBJFile("Content/FloorPlan.obj"); meshDeviceResources = new MeshDeviceResources(device, imagingFactory, mesh); // desktop duplication var output = new Output1(factory.Adapters[0].Outputs[0].NativePointer); // TODO: change adapter and output number outputDuplication = output.DuplicateOutput(device); userViewForm = new Form1(factory, device, renderLock); userViewForm.Text = "User View"; userViewForm.Show(); userViewForm.videoPanel1.MouseClick += videoPanel1_MouseClick; // connect to local camera to acquire head position if (localHeadTrackingEnabled) { localKinectSensor = KinectSensor.GetDefault(); bodyFrameReader = localKinectSensor.BodyFrameSource.OpenReader(); localKinectSensor.Open(); Console.WriteLine("connected to local camera"); new System.Threading.Thread(LocalBodyLoop).Start(); } if (liveDepthEnabled) { foreach (var cameraDeviceResource in cameraDeviceResources.Values) { cameraDeviceResource.StartLive(); } } new System.Threading.Thread(RenderLoop).Start(); }