コード例 #1
0
        public Handle <RasterizerState> Create(RasterizerStateCreation args)
        {
            var handle = _resourcePool.CreateResource();

            if (!handle.IsValid())
            {
                throw new InvalidOperationException($"Failed to Create a {nameof(RasterizerState)} Handle");
            }
            Logger.Trace <RasterizerManager>($"Creating {nameof(RasterizerState)} with .....");

            var desc = new D3D11_RASTERIZER_DESC
            {
                CullMode        = (D3D11_CULL_MODE)args.CullMode,
                FillMode        = (D3D11_FILL_MODE)args.FillMode,
                DepthClipEnable = 1,
            };

            var state = _resourcePool.GetResourcePointer(handle);

            state->CullMode = args.CullMode;
            state->FillMode = args.FillMode;

            Common.CheckAndThrow(_device->CreateRasterizerState(&desc, &state->State), nameof(ID3D11Device.CreateRasterizerState));

            return(handle);
        }
コード例 #2
0
        public virtual void GetDesc(
            out D3D11_RASTERIZER_DESC pDesc
            )
        {
            var fp = GetFunctionPointer(7);

            if (m_GetDescFunc == null)
            {
                m_GetDescFunc = (GetDescFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(GetDescFunc));
            }

            m_GetDescFunc(m_ptr, out pDesc);
        }
コード例 #3
0
ファイル: ID3D11Device.cs プロジェクト: ousttrue/ShrimpDX
        public virtual int CreateRasterizerState(
            ref D3D11_RASTERIZER_DESC pRasterizerDesc,
            out ID3D11RasterizerState ppRasterizerState
            )
        {
            var fp = GetFunctionPointer(22);

            if (m_CreateRasterizerStateFunc == null)
            {
                m_CreateRasterizerStateFunc = (CreateRasterizerStateFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(CreateRasterizerStateFunc));
            }
            ppRasterizerState = new ID3D11RasterizerState();
            return(m_CreateRasterizerStateFunc(m_ptr, ref pRasterizerDesc, out ppRasterizerState.PtrForNew));
        }
コード例 #4
0
ファイル: Main.cs プロジェクト: zhuowp/DirectN
        private void Init()
        {
            // this code is ported from https://gist.github.com/d7samurai/261c69490cce0620d0bfc93003cd1052
            var fac   = DXGIFunctions.CreateDXGIFactory2();
            var flags = D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_BGRA_SUPPORT;

#if DEBUG
            flags |= D3D11_CREATE_DEVICE_FLAG.D3D11_CREATE_DEVICE_DEBUG;
#endif

            var d3D11Device = D3D11Functions.D3D11CreateDevice(null, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_HARDWARE, flags, out _deviceContext);

            var mt = d3D11Device.As <ID3D11Multithread>();
            mt?.SetMultithreadProtected(true);

            var desc = new DXGI_SWAP_CHAIN_DESC1();
            desc.Format           = DXGI_FORMAT.DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
            desc.SampleDesc.Count = 1;
            desc.BufferUsage      = Constants.DXGI_USAGE_RENDER_TARGET_OUTPUT;
            desc.BufferCount      = 2;

            // note: this causes a warning in debug
            // DXGI WARNING: IDXGIFactory::CreateSwapChain: Blt-model swap effects (DXGI_SWAP_EFFECT_DISCARD and DXGI_SWAP_EFFECT_SEQUENTIAL) are legacy swap effects that are predominantly superceded by their flip-model counterparts (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL and DXGI_SWAP_EFFECT_FLIP_DISCARD). Please consider updating your application to leverage flip-model swap effects to benefit from modern presentation enhancements. More information is available at http://aka.ms/dxgiflipmodel. [ MISCELLANEOUS WARNING #294: ]
            _swapChain = fac.CreateSwapChainForHwnd <IDXGISwapChain1>(d3D11Device, Handle, desc);
            var frameBuffer = _swapChain.GetBuffer <ID3D11Texture2D>(0);
            _renderTargetView = d3D11Device.CreateRenderTargetView(frameBuffer);

            frameBuffer.Object.GetDesc(out var depthBufferDesc);
            _width  = depthBufferDesc.Width;
            _height = depthBufferDesc.Height;

            depthBufferDesc.Format    = DXGI_FORMAT.DXGI_FORMAT_D24_UNORM_S8_UINT;
            depthBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_DEPTH_STENCIL;
            var depthBuffer = d3D11Device.CreateTexture2D <ID3D11Texture2D>(depthBufferDesc);

            _depthBufferView = d3D11Device.CreateDepthStencilView(depthBuffer);

            var vsBlob = D3D11Functions.D3DCompileFromFile("shaders.hlsl", "vs_main", "vs_5_0");
            _vertexShader = d3D11Device.CreateVertexShader(vsBlob);

            var inputElements = new D3D11_INPUT_ELEMENT_DESC[] {
                new D3D11_INPUT_ELEMENT_DESC {
                    SemanticName = "POS", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32_FLOAT
                },
                new D3D11_INPUT_ELEMENT_DESC {
                    SemanticName = "NOR", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT)
                },
                new D3D11_INPUT_ELEMENT_DESC {
                    SemanticName = "TEX", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT)
                },
                new D3D11_INPUT_ELEMENT_DESC {
                    SemanticName = "COL", Format = DXGI_FORMAT.DXGI_FORMAT_R32G32B32A32_FLOAT, AlignedByteOffset = unchecked ((uint)Constants.D3D11_APPEND_ALIGNED_ELEMENT)
                },
            };
            _inputLayout = d3D11Device.CreateInputLayout(inputElements, vsBlob);

            var psBlob = D3D11Functions.D3DCompileFromFile("shaders.hlsl", "ps_main", "ps_5_0");
            _pixelShader = d3D11Device.CreatePixelShader(psBlob);

            var rasterizerDesc = new D3D11_RASTERIZER_DESC();
            rasterizerDesc.FillMode = D3D11_FILL_MODE.D3D11_FILL_SOLID;
            rasterizerDesc.CullMode = D3D11_CULL_MODE.D3D11_CULL_BACK;
            _rasterizerState        = d3D11Device.CreateRasterizerState(rasterizerDesc);

            var samplerDesc = new D3D11_SAMPLER_DESC();
            samplerDesc.Filter         = D3D11_FILTER.D3D11_FILTER_MIN_MAG_MIP_POINT;
            samplerDesc.AddressU       = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER;
            samplerDesc.AddressV       = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER;
            samplerDesc.AddressW       = D3D11_TEXTURE_ADDRESS_MODE.D3D11_TEXTURE_ADDRESS_BORDER;
            samplerDesc.BorderColor    = new float[4];
            samplerDesc.BorderColor[0] = 1;
            samplerDesc.BorderColor[1] = 1;
            samplerDesc.BorderColor[2] = 1;
            samplerDesc.BorderColor[3] = 1;
            samplerDesc.ComparisonFunc = D3D11_COMPARISON_FUNC.D3D11_COMPARISON_NEVER;
            _samplerState = d3D11Device.CreateSamplerState(samplerDesc);

            var depthStencilDesc = new D3D11_DEPTH_STENCIL_DESC();
            depthStencilDesc.DepthEnable    = true;
            depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK.D3D11_DEPTH_WRITE_MASK_ALL;
            depthStencilDesc.DepthFunc      = D3D11_COMPARISON_FUNC.D3D11_COMPARISON_LESS;
            _depthStencilState = d3D11Device.CreateDepthStencilState(depthStencilDesc);

            var blendDesc = new D3D11_BLEND_DESC();
            blendDesc.RenderTarget = new D3D11_RENDER_TARGET_BLEND_DESC[8];
            blendDesc.RenderTarget[0].BlendEnable           = true;
            blendDesc.RenderTarget[0].SrcBlend              = D3D11_BLEND.D3D11_BLEND_SRC_ALPHA;
            blendDesc.RenderTarget[0].DestBlend             = D3D11_BLEND.D3D11_BLEND_INV_SRC_ALPHA;
            blendDesc.RenderTarget[0].BlendOp               = D3D11_BLEND_OP.D3D11_BLEND_OP_ADD;
            blendDesc.RenderTarget[0].SrcBlendAlpha         = D3D11_BLEND.D3D11_BLEND_ZERO;
            blendDesc.RenderTarget[0].DestBlendAlpha        = D3D11_BLEND.D3D11_BLEND_ZERO;
            blendDesc.RenderTarget[0].BlendOpAlpha          = D3D11_BLEND_OP.D3D11_BLEND_OP_ADD;
            blendDesc.RenderTarget[0].RenderTargetWriteMask = (byte)(D3D11_COLOR_WRITE_ENABLE.D3D11_COLOR_WRITE_ENABLE_ALL);
            _blendState = d3D11Device.CreateBlendState(blendDesc);

            var constantBufferDesc = new D3D11_BUFFER_DESC();
            constantBufferDesc.ByteWidth      = (uint)Marshal.SizeOf <VS_CONSTANT_BUFFER>();
            constantBufferDesc.Usage          = D3D11_USAGE.D3D11_USAGE_DYNAMIC;
            constantBufferDesc.BindFlags      = (uint)D3D11_BIND_FLAG.D3D11_BIND_CONSTANT_BUFFER;
            constantBufferDesc.CPUAccessFlags = (uint)D3D11_CPU_ACCESS_FLAG.D3D11_CPU_ACCESS_WRITE;
            if ((constantBufferDesc.ByteWidth % 16) != 0)
            {
                throw new InvalidOperationException("Constant buffer size must be a multiple of 16.");
            }

            _constantBuffer = d3D11Device.CreateBuffer(constantBufferDesc);

            var vertexBufferDesc = new D3D11_BUFFER_DESC();
            var gc = GCHandle.Alloc(Data.VertexData, GCHandleType.Pinned);
            vertexBufferDesc.ByteWidth = (uint)Data.VertexData.SizeOf();
            vertexBufferDesc.Usage     = D3D11_USAGE.D3D11_USAGE_IMMUTABLE;
            vertexBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_VERTEX_BUFFER;

            var vertexData = new D3D11_SUBRESOURCE_DATA();
            vertexData.pSysMem = gc.AddrOfPinnedObject();
            _vertexBuffer      = d3D11Device.CreateBuffer(vertexBufferDesc, vertexData);
            gc.Free();

            var indexBufferDesc = new D3D11_BUFFER_DESC();
            gc = GCHandle.Alloc(Data.IndexData, GCHandleType.Pinned);
            indexBufferDesc.ByteWidth = (uint)Data.IndexData.SizeOf();
            indexBufferDesc.Usage     = D3D11_USAGE.D3D11_USAGE_IMMUTABLE;
            indexBufferDesc.BindFlags = (uint)D3D11_BIND_FLAG.D3D11_BIND_INDEX_BUFFER;

            var indexData = new D3D11_SUBRESOURCE_DATA();
            indexData.pSysMem = gc.AddrOfPinnedObject();
            _indexBuffer      = d3D11Device.CreateBuffer(indexBufferDesc, indexData);
            gc.Free();

            var textureDesc = new D3D11_TEXTURE2D_DESC();
            textureDesc.Width            = 20;
            textureDesc.Height           = 20;
            textureDesc.MipLevels        = 1;
            textureDesc.ArraySize        = 1;
            textureDesc.Format           = DXGI_FORMAT.DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
            textureDesc.SampleDesc.Count = 1;
            textureDesc.Usage            = D3D11_USAGE.D3D11_USAGE_IMMUTABLE;
            textureDesc.BindFlags        = (uint)D3D11_BIND_FLAG.D3D11_BIND_SHADER_RESOURCE;

            gc = GCHandle.Alloc(Data.TextureData, GCHandleType.Pinned);
            var textureData = new D3D11_SUBRESOURCE_DATA();
            textureData.pSysMem     = gc.AddrOfPinnedObject();
            textureData.SysMemPitch = 20 * 4; // 4 bytes per pixel
            gc.Free();

            var texture = d3D11Device.CreateTexture2D <ID3D11Texture2D>(textureDesc, textureData);
            _shaderResourceView = d3D11Device.CreateShaderResourceView(texture);
        }