渲染一个基本的四边形到屏幕?

Render a basic Quad to Screen?

我已经尝试了很长一段时间但没有成功;我在 Whosebug 上查看了几个相关问题但没有成功;我还遵循了 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

现在,这让我感到困惑的原因是我可以渲染更高级的对象,例如:


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

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 硬连线到一些我现在还无法摆脱的地方);如果这有帮助,我目前无法转换为左手坐标系。


我是不是漏掉了什么?为什么我无法渲染基本四边形?


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

使用 Direct3D 11 进行渲染时,您需要了解所有状态。您没有在此处提及您的 BlendState、DepthStencilState 或 RasterState 设置,这可能是您没有获得所需结果的原因。

  • 如果 DepthStencilState 是这样设置的,请使用 Z-Buffer,那么您的顶点的 Z 为 0 的事实意味着它们将被剔除。您可以在没有 Z 写入或 Z 测试的情况下设置 depth/stencil 状态,并且无论如何在绘制 2D 东西时绝对应该关闭 Z 写入。您还可以为顶点的 Z 值传递类似 0.5 的内容,这对于使用 3D API 的 2D 绘图来说是相当常见的。

  • 如果您在 RasterState 中启用了背面剔除,那么您的顶点的缠绕顺序可能会导致它们被跳过。您可以玩不同的缠绕顺序,或禁用剔除。

这里的顶点着色器和像素着色器也很重要。您没有显示用于设置着色器或着色器常量的代码,也没有显示 HLSL。

您应该认真考虑使用 SharpDX Toolkit SpriteBatch class for efficient quad rendering or looking at their source for it

I know you are using SharpDX an C#, but you might find it useful to see the DirectX Tool Kit for DX11 tutorial on drawing 2D shapes.