渲染基本的Quad屏幕?

时间:2018-12-14 18:17:07

标签: c# directx-11 sharpdx

我一直在努力完成这项工作,但没有成功;我已经在StackOverflow上查看了几个相关的问题,但都没有成功;我还遵循了6个不同的教程,所有这些教程几乎都遵循相同的过程:

  1. 构建顶点:-1, -1, 0-1, 1, 01, 1, 01, -1, 0
  2. 建立索引:0, 1, 2, 0, 2, 3
  3. 创建VertexIndex缓冲区。
  4. 清除RenderTargetView
  5. 设置当前的VertexPixel着色器。
  6. 如果有,请更新常量缓冲区。
  7. 渲染四边形(见下文)。
  8. 冲洗并重复4 - 8

现在,这把我引到墙上的原因是因为我可以渲染更高级的对象,例如:

  • 领域
  • 3D线
  • 粉丝

我创建四边形的代码与其他所有人的代码几乎相同:

public class Quad {
    private void SetVertices() {
        float width = Rescale(Size.Width, 0, Application.Width, -1, 1);
        float height = Rescale(Size.Height, 0, Application.Height, -1, 1);
        vertices = new Vertex[] {
            new Vertex(new Vector3(-width, -height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(-width, height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(width, height, 0), Vector3.ForwardLH, Color.White),
            new Vertex(new Vector3(width, -height, 0), Vector3.ForwardLH, Color.White)
        }
        indices = new int[] { 0, 1, 2, 0, 2, 3 };
        vertexBuffer = Buffer.Create(Device3D, BindFlags.VertexBuffer, vertices);
        vertexBinding = new VertexBufferBinding(vertexBuffer, Utilities.SIzeOf<Vertex>(), 0);
        indexBuffer = Buffer.Create(Device3D, BindFlags.IndexBuffer, indices);
        indexCount = indices.Length;
    }
    public void Render() {
        if (shaderResourceView != null)
            context3D.PixelShader.SetShaderResource(0, shaderResourceView);
        context3D.PixelShader.SetSampler(0, samplerState);
        context3D.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleStrip;
        context3D.InputAssembler.SetVertexBuffers(0, vertexBinding);
        context3D.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, 0);
        context3D.DrawIndexed(totalIndexCount, 0, 0);
    }
}

注释

我使用的是右手坐标系(由于某些原因,以前的开发人员将Vector3.ForwardLH硬连线到了我现在无法摆脱的某些地方);如果有帮助,我目前无法转换为左手坐标系。


我在这里错过了什么吗?为什么我无法渲染基本四边形?


如果您需要更多信息,请随时告诉我,我将根据要求添加。

1 个答案:

答案 0 :(得分:1)

使用Direct3D 11渲染时,您需要了解所有状态。您不会提及这里的BlendState,DepthStencilState或RasterState设置,这可能是您无法获得所需结果的原因。

  • 如果DepthStencilState这样设置,则使用Z缓冲区,那么您的顶点的Z值为0的事实意味着它们将被剔除。您可以在没有Z写或Z测试的情况下设置深度/模板状态,并且无论如何绘制2D素材时,您绝对应该关闭Z写。您还可以为顶点的Z值传递类似0.5的值,这对于使用3D API进行2D绘图来说是很常见的。

  • 如果在RasterState中启用了背面剔除,则顶点的缠绕顺序可能会导致其被跳过。您可以使用不同的缠绕顺序,也可以禁用淘汰。

这真的很重要,您的Vertex Shader和Pixel Shader在这里。您不会显示用于设置着色器或着色器常量的代码,也不会显示HLSL。

您应该认真考虑使用SharpDX Toolkit SpriteBatch类进行高效的四边形渲染或查看其source for it

  

我知道您在使用SharpDX和C#,但是您可能会发现查看DirectX Tool Kit for DX11绘制2D形状的教程很有用。