【问题标题】:SlimDX Direct3D 11 Indexing ProblemsSlimDX Direct3D 11 索引问题
【发布时间】:2011-02-13 14:41:26
【问题描述】:

我正在尝试使用 SlimDX 和 Direct3D11 绘制索引正方形。我已经设法绘制了一个没有索引的正方形,但是当我切换到我的索引版本时,我只是得到一个空白屏幕。

我的输入布局设置为仅获取位置数据(我实际上是从 SlimDX 网站上的第三个教程扩展而来)并绘制三角形列表。

我的渲染循环代码如下(我使用的是教程中的 triangle.fx 像素和顶点着色器文件,它们采用顶点位置(在屏幕坐标中)并将它们涂成黄色,D3D 是 SlimDX.Direct3D11 的简写)

//clear the render target
context.ClearRenderTargetView(renderTarget, new Color4(0.5f, 0.5f, 1.0f));
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(mesh.VertexBuffer,12, 0));
context.InputAssembler.SetIndexBuffer(mesh.IndexBuffer, Format.R16_UNorm, 0);
context.DrawIndexed(mesh.indices, 0, 0);
swapChain.Present(0, PresentFlags.None);

“mesh”是一个包含顶点缓冲区、索引缓冲区和顶点计数的结构。数据在这里填写:

Vertex[] vertexes = new Vertex[4];
vertexes[0].Position = new Vector3(0, 0, 0.5f);
vertexes[1].Position = new Vector3(0, 0.5f, 0.5f);
vertexes[2].Position = new Vector3(0.5f, 0, 0.5f);
vertexes[3].Position = new Vector3(0.5f, 0.5f, 0.5f);

UInt16[] indexes = { 0, 1, 2, 1, 3, 2 };
DataStream vertices = new DataStream(12 * 4, true, true);
foreach (Vertex vertex in vertexes)
{
    vertices.Write(vertex.Position);
}
vertices.Position = 0;
DataStream indices = new DataStream(sizeof(int) * 6, true, true);
foreach (UInt16 index in indexes)
{
    indices.Write(index);
}
indices.Position = 0;
mesh = new Mesh();
D3D.Buffer vertexBuffer = new D3D.Buffer(device, vertices, 12 * 4, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
mesh.VertexBuffer = vertexBuffer;
mesh.IndexBuffer = new D3D.Buffer(device, indices, 2 * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
mesh.vertices = vertexes.GetLength(0);
mesh.indices = indexes.Length;

所有这一切都与我的未索引正方形方法几乎相同(添加了索引缓冲区和索引,并删除了索引不需要的两个重复顶点),但是当未索引方法绘制一个正方形时,索引方法没有。

我目前的理论是这条线有问题:

mesh.IndexBuffer = new D3D.Buffer(device, indices, 2 * 6, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);

或者这些行:

context.InputAssembler.SetIndexBuffer(mesh.IndexBuffer, Format.R16_UNorm, 0);
context.DrawIndexed(mesh.indices, 0, 0);

【问题讨论】:

    标签: c# graphics indexing direct3d slimdx


    【解决方案1】:

    对于这个简单的例子,为什么不直接使用顶点和索引缓冲区?

    像这样(Directx9):

    VertexBuffer vb;
    IndexBuffer ib;
    
    vertices = new PositionColored[WIDTH * HEIGHT];
    //vertex creation
    vb = new VertexBuffer(device, HEIGHT * WIDTH * PositionColored.SizeInBytes, Usage.WriteOnly, PositionColored.Format, Pool.Default);
    DataStream stream = vb.Lock(0, 0, LockFlags.None);
    stream.WriteRange(vertices);
    vb.Unlock();
    
    indices = new short[(WIDTH - 1) * (HEIGHT - 1) * 6];
    //indicies creation
    ib = new IndexBuffer(device, sizeof(int) * (WIDTH - 1) * (HEIGHT - 1) * 6, Usage.WriteOnly, Pool.Default, false);
    DataStream stream = ib.Lock(0, 0, LockFlags.None);
    stream.WriteRange(indices);
    ib.Unlock();
    
    //Drawing
    device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0);
    device.BeginScene();
    device.VertexFormat = PositionColored.Format;
    device.SetStreamSource(0, vb, 0, PositionColored.SizeInBytes);
    device.Indices = ib;
    device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle));
    device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, WIDTH * HEIGHT, 0, indices.Length / 3);
    device.EndScene();
    device.Present();
    

    我以另一种方式使用网格(再次使用directx9代码):

            private void CreateMesh()
            {
                meshTerrain = new Mesh(device, (WIDTH - 1) * (HEIGHT - 1) * 2, WIDTH * HEIGHT, MeshFlags.Managed, PositionColored.Format);
                DataStream stream = meshTerrain.VertexBuffer.Lock(0, 0, LockFlags.None);
                stream.WriteRange(vertices);
                meshTerrain.VertexBuffer.Unlock();
                stream.Close();
                stream = meshTerrain.IndexBuffer.Lock(0, 0, LockFlags.None);
                stream.WriteRange(indices);
                meshTerrain.IndexBuffer.Unlock();
                stream.Close();
    
                meshTerrain.GenerateAdjacency(0.5f);
                meshTerrain.OptimizeInPlace(MeshOptimizeFlags.VertexCache);
    
                meshTerrain = meshTerrain.Clone(device, MeshFlags.Dynamic, PositionNormalColored.Format);
                meshTerrain.ComputeNormals();
            }
    
    
            //Drawing
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.DarkSlateBlue, 1.0f, 0);    
            device.BeginScene();
            device.VertexFormat = PositionColored.Format;
            device.SetTransform(TransformState.World, Matrix.Translation(-HEIGHT / 2, -WIDTH / 2, 0) * Matrix.RotationZ(angle));
    
            int numSubSets = meshTerrain.GetAttributeTable().Length;
            for (int i = 0; i < numSubSets; i++)
            {
                meshTerrain.DrawSubset(i);
            }
            device.EndScene();
            device.Present();
    

    【讨论】:

    • Mesh 类在我正在使用的 Direct3D11 命名空间中不可用(对不起,应该说!),我的代码中的 Mesh 是我创建的结构。我不确定 Direct3D9 代码(我实际上最终计划将旧的 MDX 项目转换为在 SlimDX Direct3D11 中运行)转换为 DX11 的效果如何,但我会试一试
    • 试试这里列出的代码:rkoenig.eu/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多