private void BuildDepthStencilView(int w, int h) { var depthBufferDesc = new Texture2DDescription() { Width = w, Height = h, MipLevels = 0, ArraySize = 1, Format = Format.D24_UNorm_S8_UInt, SampleDescription = new SampleDescription(1, 0), Usage = ResourceUsage.Default, BindFlags = BindFlags.DepthStencil, CpuAccessFlags = CpuAccessFlags.None, OptionFlags = ResourceOptionFlags.None }; m_depthStencilBuffer = Device.CreateTexture2D(depthBufferDesc); var depthStencilDecs = new DepthStencilDescription() { DepthEnable = true, DepthWriteMask = DepthWriteMask.All, DepthFunc = ComparisonFunction.Less, StencilEnable = true, StencilReadMask = 0xFF, StencilWriteMask = 0xFF, FrontFace = new DepthStencilOperationDescription() { StencilFailOp = StencilOperation.Keep, StencilDepthFailOp = StencilOperation.Incr, StencilPassOp = StencilOperation.Keep, StencilFunc = ComparisonFunction.Always, }, BackFace = new DepthStencilOperationDescription() { StencilFailOp = StencilOperation.Keep, StencilDepthFailOp = StencilOperation.Decr, StencilPassOp = StencilOperation.Keep, StencilFunc = ComparisonFunction.Always, } }; DepthStencilState = Device.CreateDepthStencilState(depthStencilDecs); DeviceContext.OMSetDepthStencilState(DepthStencilState); var depthStencilViewDesc = new DepthStencilViewDescription() { Format = Format.D24_UNorm_S8_UInt, ViewDimension = DepthStencilViewDimension.Texture2D, Texture2D = new Texture2DDepthStencilView() { MipSlice = 0 } }; m_DepthStencilView = Device.CreateDepthStencilView(m_depthStencilBuffer, depthStencilViewDesc); DeviceContext.OMSetRenderTargets(m_RenderTargetView, m_DepthStencilView); }
private ID3D11DepthStencilState CreateNewDepthStencilState(ref DepthStencilStateDescription description) { DepthStencilDescription dssDesc = new DepthStencilDescription { DepthFunc = D3D11Formats.VdToD3D11ComparisonFunc(description.DepthComparison), DepthEnable = description.DepthTestEnabled, DepthWriteMask = description.DepthWriteEnabled ? DepthWriteMask.All : DepthWriteMask.Zero, StencilEnable = description.StencilTestEnabled, FrontFace = ToD3D11StencilOpDesc(description.StencilFront), BackFace = ToD3D11StencilOpDesc(description.StencilBack), StencilReadMask = description.StencilReadMask, StencilWriteMask = description.StencilWriteMask }; return(_device.CreateDepthStencilState(dssDesc)); }
GraphicsPipelineState makeTriangle(ResourceCreateContext ctx) { var triangleVertex = UniqueCreator.Graphics.Gpu.Shaders.triangle_vertex.Factory.Create(); var trianglePixel = UniqueCreator.Graphics.Gpu.Shaders.triangle_pixel.Factory.Create(); var description2 = new GraphicsPipelineStateDescription(); var rasterizerState = new RasterizerDescription(); var samples = new SampleDescription { Count = 1, Quality = 0 }; var depthStencil = new DepthStencilDescription { DepthEnable = true, StencilEnable = false, DepthWriteMask = DepthWriteMask.All, DepthFunc = ComparisonFunction.Less }; depthStencil.BackFace.StencilFailOperation = StencilOperation.Keep; depthStencil.BackFace.StencilPassOperation = StencilOperation.Keep; depthStencil.BackFace.StencilFunction = ComparisonFunction.Always; depthStencil.BackFace.StencilDepthFailOperation = StencilOperation.Keep; depthStencil.FrontFace = depthStencil.BackFace; depthStencil.StencilReadMask = 0xff; depthStencil.StencilWriteMask = 0xff; rasterizerState.CullMode = CullMode.Back; rasterizerState.FillMode = FillMode.Solid; rasterizerState.FrontCounterClockwise = true; rasterizerState.AntialiasedLineEnable = false; rasterizerState.ConservativeRaster = ConservativeRasterizationMode.Off; rasterizerState.DepthBias = 0; rasterizerState.DepthBiasClamp = 0.0f; rasterizerState.SlopeScaledDepthBias = 0.0f; rasterizerState.DepthClipEnable = true; rasterizerState.ForcedSampleCount = 0; rasterizerState.MultisampleEnable = false; var blendState = new BlendDescription { AlphaToCoverageEnable = false, IndependentBlendEnable = false }; var blend = new RenderTargetBlendDescription { BlendEnable = false, LogicOperationEnable = false, BlendOperation = BlendOperation.Add, BlendOperationAlpha = BlendOperation.Add, LogicOperation = LogicOperation.Clear, DestinationBlend = Blend.DestinationColor, DestinationBlendAlpha = Blend.DestinationAlpha, SourceBlend = Blend.SourceColor, SourceBlendAlpha = Blend.SourceAlpha, RenderTargetWriteMask = 0xF }; blendState.RenderTargets = new RenderTargetBlendDescription[] { blend }; description2.VS = triangleVertex; description2.PS = trianglePixel; description2.SampleMask = 0xFFFFFFFF; description2.RasterizerState = rasterizerState; description2.PrimitiveTopology = PrimitiveTopologyType.Triangle; description2.Samples = samples; description2.DepthStencilState = depthStencil; description2.DsvFormat = GraphicsFormat.D32_Single; description2.IbStripCutValue = IndexBufferStripCut.ValueDisabled; description2.BlendState = blendState; description2.RtvFormats.Add(GraphicsFormat.R8G8B8A8_UNORM); return(new GraphicsPipelineState(ctx, description2)); }
void CreateDeviceObjects() { var vertexShaderCode = @" cbuffer vertexBuffer : register(b0) { float4x4 ProjectionMatrix; }; struct VS_INPUT { float2 pos : POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; struct PS_INPUT { float4 pos : SV_POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; PS_INPUT main(VS_INPUT input) { PS_INPUT output; output.pos = mul(ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f)); output.col = input.col; output.uv = input.uv; return output; }"; Compiler.Compile(vertexShaderCode, "main", "vs", "vs_4_0", out vertexShaderBlob, out var errorBlob); if (vertexShaderBlob == null) { throw new Exception("error compiling vertex shader"); } vertexShader = device.CreateVertexShader(vertexShaderBlob.GetBytes()); var inputElements = new[] { new InputElementDescription("POSITION", 0, Format.R32G32_Float, 0, 0, InputClassification.PerVertexData, 0), new InputElementDescription("TEXCOORD", 0, Format.R32G32_Float, 8, 0, InputClassification.PerVertexData, 0), new InputElementDescription("COLOR", 0, Format.R8G8B8A8_UNorm, 16, 0, InputClassification.PerVertexData, 0), }; inputLayout = device.CreateInputLayout(inputElements, vertexShaderBlob); var constBufferDesc = new BufferDescription { SizeInBytes = VertexConstantBufferSize, Usage = Vortice.Direct3D11.Usage.Dynamic, BindFlags = BindFlags.ConstantBuffer, CpuAccessFlags = CpuAccessFlags.Write }; constantBuffer = device.CreateBuffer(constBufferDesc); var pixelShaderCode = @"struct PS_INPUT { float4 pos : SV_POSITION; float4 col : COLOR0; float2 uv : TEXCOORD0; }; sampler sampler0; Texture2D texture0; float4 main(PS_INPUT input) : SV_Target { float4 out_col = input.col * texture0.Sample(sampler0, input.uv); return out_col; }"; Compiler.Compile(pixelShaderCode, "main", "ps", "ps_4_0", out pixelShaderBlob, out errorBlob); if (pixelShaderBlob == null) { throw new Exception("error compiling pixel shader"); } pixelShader = device.CreatePixelShader(pixelShaderBlob.GetBytes()); var blendDesc = new BlendDescription { AlphaToCoverageEnable = false }; blendDesc.RenderTarget[0] = new RenderTargetBlendDescription { IsBlendEnabled = true, SourceBlend = Blend.SourceAlpha, DestinationBlend = Blend.InverseSourceAlpha, BlendOperation = BlendOperation.Add, SourceBlendAlpha = Blend.InverseSourceAlpha, DestinationBlendAlpha = Blend.Zero, BlendOperationAlpha = BlendOperation.Add, RenderTargetWriteMask = ColorWriteEnable.All }; blendState = device.CreateBlendState(blendDesc); var rasterDesc = new RasterizerDescription { FillMode = FillMode.Solid, CullMode = CullMode.None, ScissorEnable = true, DepthClipEnable = true }; rasterizerState = device.CreateRasterizerState(rasterDesc); var stencilOpDesc = new DepthStencilOperationDescription(StencilOperation.Keep, StencilOperation.Keep, StencilOperation.Keep, ComparisonFunction.Always); var depthDesc = new DepthStencilDescription { DepthEnable = false, DepthWriteMask = DepthWriteMask.All, DepthFunc = ComparisonFunction.Always, StencilEnable = false, FrontFace = stencilOpDesc, BackFace = stencilOpDesc }; depthStencilState = device.CreateDepthStencilState(depthDesc); CreateFontsTexture(); }