C# 无法在Windows 10 Universal App上使用SharpDX绘制基本体(但仍能清除背景)
对不起,因为我的英语不好。我试图用SharpDX在Windows 10应用程序上编写一个非常简单的DirectX 11,它在窗口的中间绘制一个三角形。问题是,当我仍然可以更改背景颜色(使用ClearRenderTargetView)时,三角形不会显示。我验证了渲染函数是周期性调用的,我的三角形是正面(顺时针)。我所尝试的:C# 无法在Windows 10 Universal App上使用SharpDX绘制基本体(但仍能清除背景),c#,directx,directx-11,windows-10-universal,sharpdx,C#,Directx,Directx 11,Windows 10 Universal,Sharpdx,对不起,因为我的英语不好。我试图用SharpDX在Windows 10应用程序上编写一个非常简单的DirectX 11,它在窗口的中间绘制一个三角形。问题是,当我仍然可以更改背景颜色(使用ClearRenderTargetView)时,三角形不会显示。我验证了渲染函数是周期性调用的,我的三角形是正面(顺时针)。我所尝试的: 禁用背面剔除 设置静态宽度和高度 尝试其他基本体(直线、三角形带) 将顶点着色器输入从float3更改为float4,反之亦然 我发现,这有非常相似的症状,但仍然不工作
- 禁用背面剔除
- 设置静态宽度和高度
- 尝试其他基本体(直线、三角形带)
- 将顶点着色器输入从float3更改为float4,反之亦然
D3D11.Buffer triangleVertBuffer;
D3D11.VertexShader vs;
D3D11.PixelShader ps;
D3D11.InputLayout vertLayout;
RawVector3[] verts;
private void InitScene()
{
D3D11.InputElement[] inputElements = new D3D11.InputElement[]
{
new D3D11.InputElement("POSITION", 0, DXGI.Format.R32G32B32_Float, 0)
};
using (CompilationResult vsResult = ShaderBytecode.CompileFromFile("vs.hlsl", "main", "vs_4_0"))
{
vs = new D3D11.VertexShader(device, vsResult.Bytecode.Data);
vertLayout = new D3D11.InputLayout(device, vsResult.Bytecode, inputElements);
}
using (CompilationResult psResult = ShaderBytecode.CompileFromFile("ps.hlsl", "main", "ps_4_0"))
ps = new D3D11.PixelShader(device, psResult.Bytecode.Data);
deviceContext.VertexShader.Set(vs);
deviceContext.PixelShader.Set(ps);
verts = new RawVector3[] {
new RawVector3( 0.0f, 0.5f, 0.5f ),
new RawVector3( 0.5f, -0.5f, 0.5f ),
new RawVector3( -0.5f, -0.5f, 0.5f )
};
triangleVertBuffer = D3D11.Buffer.Create(device, D3D11.BindFlags.VertexBuffer, verts);
deviceContext.InputAssembler.InputLayout = vertLayout;
deviceContext.InputAssembler.PrimitiveTopology = D3D.PrimitiveTopology.TriangleList;
}
private void RenderScene()
{
this.deviceContext.ClearRenderTargetView(this.backBufferView, new RawColor4(red, green, blue, 0));
deviceContext.InputAssembler.SetVertexBuffers(0,
new D3D11.VertexBufferBinding(triangleVertBuffer, Utilities.SizeOf<RawVector3>(), 0));
deviceContext.Draw(verts.Length, 0);
this.swapChain.Present(0, DXGI.PresentFlags.None);
}
private void RenderScene()
{
this.deviceContext.ClearRenderTargetView(this.backBufferView,新的RawColor4(红色、绿色、蓝色,0));
deviceContext.InputAssembler.SetVertexBuffers(0,
新的D3D11.VertexBufferBinding(triangleVertBuffer,Utilities.SizeOf(),0));
deviceContext.Draw(垂直长度,0);
this.swapChain.Present(0,DXGI.PresentFlags.None);
}
谢谢你的帮助。我已经解决了这个问题。我在Visual Studio中使用了图形调试器,并检测到OutputMerge没有RenderTarget。所以我移动这条线
this.deviceContext.OutputMerger.SetRenderTargets(this.backBufferView);
调用RenderScene()函数,它就可以工作了。然而,我不明白为什么我必须在每一帧重置这个。我是Direct3D新手,所以如果有人有anwswer,请发表评论。多谢各位
p/s:我已经将GitHub上的工作项目提交给了遇到同样问题的人
this.deviceContext.OutputMerger.SetRenderTargets(this.backBufferView);