C# 将基本四边形渲染到屏幕?

C# 将基本四边形渲染到屏幕?,c#,directx-11,sharpdx,C#,Directx 11,Sharpdx,我已经尝试了很长一段时间,但没有成功;我在StackOverflow上研究了几个相关问题,但没有成功;我还学习了6个不同的教程,它们都遵循了几乎相同的过程: 构建顶点:-1,-1,0,-1,1,0,1,1,0,以及1,-1,0 建立索引:0,1,2,0,2,3 创建顶点和索引缓冲区 清除渲染目标视图 设置当前的顶点和像素着色器 如果有常量缓冲区,请更新它们 渲染四边形(请参见下文) 冲洗并重复4-8 现在,这让我抓狂的原因是我可以渲染更高级的对象,例如: 球体 三维线条 扇子 我创建四边形

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

  • 构建顶点:
    -1,-1,0
    -1,1,0
    1,1,0
    ,以及
    1,-1,0
  • 建立索引:
    0,1,2,0,2,3
  • 创建
    顶点
    索引
    缓冲区
  • 清除
    渲染目标视图
  • 设置当前的
    顶点
    像素
    着色器
  • 如果有常量缓冲区,请更新它们
  • 渲染四边形(请参见下文)
  • 冲洗并重复
    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);
        }
    }
    
    公共类四元组{
    私有void SetVertices(){
    浮动宽度=重新缩放(Size.width,0,Application.width,-1,1);
    浮动高度=重新缩放(Size.height,0,Application.height,-1,1);
    顶点=新顶点[]{
    新顶点(新矢量3(-width,-height,0),矢量3.lh,Color.White),
    新顶点(新矢量3(-width,height,0),矢量3.lh,Color.White),
    新顶点(新矢量3(宽度、高度、0)、矢量3.lh、颜色、白色),
    新顶点(新矢量3(宽度,-高度,0),矢量3.LH,颜色。白色)
    }
    索引=新的int[]{0,1,2,0,2,3};
    vertexBuffer=Buffer.Create(Device3D,BindFlags.vertexBuffer,顶点);
    vertexBinding=新的VertexBufferBinding(vertexBuffer,Utilities.SIzeOf(),0);
    indexBuffer=Buffer.Create(Device3D,BindFlags.indexBuffer,index);
    indexCount=指数长度;
    }
    公共无效呈现(){
    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);
    DrawIndexed(totalIndexCount,0,0);
    }
    }
    

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


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



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

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

    • 如果DepthStencilState是这样设置的,请使用Z缓冲区,那么顶点的Z值为0这一事实意味着它们将被剔除。您可以在不进行Z写入或Z测试的情况下设置深度/模具状态,并且无论如何,在绘制2D内容时,您都应该明确关闭Z写入。您还可以为顶点传递类似于
      0.5
      的Z值,这在使用3D API的2D绘图中非常常见

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

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

    <>你应该认真考虑使用<代码> SpReTeBuff< /Cord>类进行高效的四次渲染或查看它们的.< /P> 我知道您使用的是SharpDX和C#,但您可能会发现阅读有关绘制二维形状的教程很有用