代码之家  ›  专栏  ›  技术社区  ›  Hazel へいぜる

呈现一个基本的四元到屏幕?

  •  -1
  • Hazel へいぜる  · 技术社区  · 6 年前

    我已经尝试了很长一段时间,但没有成功;我在StackOverflow上看到了几个相关的问题,但没有成功;我还学习了6个不同的教程,它们都遵循了几乎相同的过程:

    1. 构建顶点: -1, -1, 0 , -1, 1, 0 , 1, 1, 0 1, -1, 0 .
    2. 建立索引: 0, 1, 2, 0, 2, 3 .
    3. 创建 Vertex Index 缓冲器。
    4. 清除 RenderTargetView .
    5. 设置电流 顶点 Pixel 着色器。
    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 到一些我现在还不能摆脱的地方);如果有帮助,我现在不能转换成左手坐标系。


    我是不是错过了什么?为什么我不能呈现一个基本的四边形?


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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Chuck Walbourn    6 年前

    使用Direct3D 11进行渲染时,需要了解所有状态。您没有提到BlendState、DepthStencilstate或Rasterstate设置在这里,这可能是您无法获得所需结果的原因。

    • 如果depthstencilstate是这样设置的,那么使用z缓冲区,那么顶点的z值为0意味着它们将被剔除。您可以设置深度/模具状态,而不需要z写入或z测试,而且无论如何,在绘制二维资料时,您应该绝对关闭z写入。你也可以通过 0.5 对于顶点的z值,这对于使用3D API的二维绘图来说相当常见。

    • 如果在rasterstate中启用了背面剔除,则顶点的缠绕顺序可能会导致跳过它们。你可以玩不同的缠绕命令,或禁用剔除。

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

    你应该认真考虑使用 SharpDX Toolkit SpriteBatch 类,用于高效的四重渲染或查看 source for it .

    我知道你用的是夏普X和C, 但是 你可能会发现看到 DirectX Tool Kit for DX11 关于绘制二维形状的教程。