예제 #1
0
        public void Render(DX11.Device device, Matrix world, Matrix viewProj)
        {
            DX11.DeviceContext m_deviceContext = device.ImmediateContext;

            m_deviceContext.InputAssembler.InputLayout       = m_vertexLayout;                      //Priradenie opisu dát pre "Input assembler stage"
            m_deviceContext.InputAssembler.PrimitiveTopology = DX11.PrimitiveTopology.TriangleList; //Spôsob interpretácie vrcholov ako zoznam 3-uholníkov
            m_deviceContext.InputAssembler.SetIndexBuffer(m_indexBuffer, DXGI.Format.R16_UInt, 0);  //Index buffer priradený k "Input assembler stage"
            m_deviceContext.InputAssembler.SetVertexBuffers(0, new DX11.VertexBufferBinding(m_vertexBuffer, Marshal.SizeOf(typeof(Vertex)), 0));
            m_transformVariable.SetMatrix(world * viewProj);                                        //Nastavenie združenej transformačnej matice pre transform. súradníc vrcholov do obrazovkových
            m_effectPass.Apply(m_deviceContext);

            m_deviceContext.DrawIndexed(36, 0, 0);   //Renderovanie indexovaných dát
        }
        // Inicializácia zariadenia a ďalších potrebných zdrojov pre rendering. Metóda vráti true, ak skončí bez chyby.
        private bool Initialize3D()
        {
            try
            {
                //Vytvorenie objektu typu SwapChainDescription a nastavenie jeho vlastností
                m_swapChainDesc = new DXGI.SwapChainDescription();
                m_swapChainDesc.OutputHandle    = panelVykresli.Handle;
                m_swapChainDesc.IsWindowed      = true;
                m_swapChainDesc.BufferCount     = 1;
                m_swapChainDesc.Flags           = DXGI.SwapChainFlags.AllowModeSwitch;
                m_swapChainDesc.ModeDescription = new DXGI.ModeDescription(
                    panelVykresli.Width,
                    panelVykresli.Height,
                    new Rational(60, 1),
                    DXGI.Format.R8G8B8A8_UNorm);
                m_swapChainDesc.SampleDescription = new DXGI.SampleDescription(1, 0);
                m_swapChainDesc.SwapEffect        = DXGI.SwapEffect.Discard;
                m_swapChainDesc.Usage             = DXGI.Usage.RenderTargetOutput;

                ///Vytvorenie objektu zariadenie a SwapChain spoločne jednou metódou
                DX11.Device.CreateWithSwapChain(
                    DriverType.Warp,                //Typ renderovacieho zariadenia: SW renderer: Reference, Warp, Hardware - hardvérový renderer:  http://slimdx.org/tutorials/DeviceCreation.php
                    DeviceCreationFlags.None,       //Žiadne extra návestia
                    m_levels,                       //Kompatibilita s verziami DX
                    m_swapChainDesc,                //Objekt typu SwapChainDescription
                    out m_device,                   //vráti Direct3D zariadenie reprezentujúce virtuálny graf. HW
                    out m_swapChain);               //vráti SwapChain pre prácu s baframi

                //Vytvorenie zobrazovacej plochy - celé okno ap.
                var m_viewPort = new Viewport(0.0f, 0.0f, panelVykresli.Width, panelVykresli.Height);

                //Vytvorenie objektu zadného bafra a cieľa renderovania
                DX11.Texture2D m_backBuffer = Texture2D.FromSwapChain <Texture2D>(m_swapChain, 0);
                m_renderTarget = new RenderTargetView(m_device, m_backBuffer);

                m_deviceContext = m_device.ImmediateContext;             //Nastavenie kontextu zariadenia, ktorý obsahuje nastavenia pre D3D zariadenie, tu priame renderovanie bez vytvárania príkazového zoznamu. Pozri: http://msdn.microsoft.com/en-us/library/windows/desktop/ff476880%28v=vs.85%29.aspx
                m_deviceContext.Rasterizer.SetViewports(m_viewPort);     //Nastavenie zobrazovacej plochy
                m_deviceContext.OutputMerger.SetTargets(m_renderTarget); //Nastavenie cieľa renderovania
            }
            catch (Exception ex)
            {
                MessageBox.Show("Chyba počas inicializácie Direct3D11: \n" + ex.Message);
                m_initialized = false;
            }

            return(m_initialized);
        }