【问题标题】:Unable to draw Primitives on Texture in SharpDX无法在 SharpDX 中的纹理上绘制图元
【发布时间】:2022-01-23 08:34:35
【问题描述】:

在我的 SharpDX Direct11 应用程序中渲染有一点问题。

我已经在纹理上测试了渲染场景,然后在 backBuffer 上绘制了这个纹理......但不幸的是,renderTexture 不包含应该绘制的图元。纹理仅由颜色填充。

github上的整个项目:https://github.com/Kordi3112/SharpDXTest11

带有渲染方法的主要代码部分:

public override void Render()
    {
        //Camera
        var proj = Matrix.OrthoLH(3 * Form.Bounds.Width / Form.Bounds.Height, 3, 0.01f, 100f);
        var view = Matrix.LookAtLH(new Vector3(0, 0, -10), new Vector3(0, 0, 20), Vector3.UnitY);
        var viewProj = Matrix.Multiply(view, proj);

        var world = Matrix.Identity;

        var worldViewProj = world * viewProj;
        worldViewProj.Transpose();

        //Update wvp matrix
        Context.UpdateSubresource(ref worldViewProj, ContantBuffer);

        DrawOnTexture();

        //Set BackBuffer as render target
        Context.OutputMerger.SetTargets(depthView, renderView);

        // Clear views
        Context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0);
        Context.ClearRenderTargetView(renderView, Color.Pink);

        //Set TextureColor Shader
        Effect2.ApplyShader(Context);

        //Set Buffers
        Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer2, Utilities.SizeOf<VertexPositionColorTexture>(), 0));
        Context.InputAssembler.SetIndexBuffer(IndexBuffer, Format.R32_UInt, 0);

        //Set Texture to Shader
        Context.PixelShader.SetShaderResource(0, RenderTexture.ShaderResourceView);

        //Draw 
        Context.DrawIndexed(6, 0, 0);

        // Present!
        SwapChain.Present(0, PresentFlags.None);
    }

    private void DrawOnTexture()
    {
        //Set Color Shader
        Effect1.ApplyShader(Context);

        //Set Buffers
        Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, Utilities.SizeOf<VertexPositionColor>(), 0));
        Context.InputAssembler.SetIndexBuffer(IndexBuffer, Format.R32_UInt, 0);

        //Set Target
        RenderTexture.SetRenderTarget(Context, depthView);

        //Clear Targets - Green Bgound
        RenderTexture.ClearRenderTarget(Context, depthView, 0, 1, 0, 1);

        //Draw on RenderTarget
        Context.DrawIndexed(6, 0, 0);

    }

调用后:Context.DrawIndexed(6, 0, 0); in private void DrawOnTexture() 应该绘制原语。

What this code above do

What i wanted to get

我的代码有什么问题?

【问题讨论】:

  • 不确定Matrix.Multiply 和 * 是如何实现的,但请确保您的矩阵以正确的顺序相乘。通常对于 MVP,您会以相反的顺序相乘 Projection * View * Model。或者在您的情况下,模型将是world。接下来确保您的相机朝向正确的方向,如果您尝试绘制两个三角形(矩形),它们可能会因为没有朝向相机而被剔除。

标签: c# rendering directx-11 sharpdx


【解决方案1】:

我确定问题不在于矩阵或相机。当我将修改代码以直接在 backBuffer 上渲染图元时,它的绘图正常。

    public override void Render()
    {
        //Camera
        var proj = Matrix.OrthoLH(3 * Form.Bounds.Width / Form.Bounds.Height, 3, 0.01f, 100f);
        var view = Matrix.LookAtLH(new Vector3(0, 0, -10), new Vector3(0, 0, 20), Vector3.UnitY);
        var viewProj = Matrix.Multiply(view, proj);

        var world = Matrix.Identity;

        var worldViewProj = world * viewProj;
        worldViewProj.Transpose();

        //Update wvp matrix
        Context.UpdateSubresource(ref worldViewProj, ContantBuffer);

        //DrawOnTexture();

        //Set BackBuffer as render target
        Context.OutputMerger.SetTargets(depthView, renderView);

        // Clear views
        Context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0);
        Context.ClearRenderTargetView(renderView, Color.Pink);

        //Set Color Shader
        Effect1.ApplyShader(Context);

        //Set Buffers
        Context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(VertexBuffer, Utilities.SizeOf<VertexPositionColor>(), 0));
        Context.InputAssembler.SetIndexBuffer(IndexBuffer, Format.R32_UInt, 0);

        //Set Texture to Shader
        //Context.PixelShader.SetShaderResource(0, RenderTexture.ShaderResourceView);

        //Draw 
        Context.DrawIndexed(6, 0, 0);

        // Present!
        SwapChain.Present(0, PresentFlags.None);
    }

output

顶点缓冲区声明:

//Position Color
        VertexBuffer = Buffer.Create(Device, BindFlags.VertexBuffer, new[] {
            new VertexPositionColor(new Vector4(-1, -1, 0, 1), Color.Red.ToVector4()),
            new VertexPositionColor(new Vector4(-1, 1, 0, 1), Color.Green.ToVector4()),
            new VertexPositionColor(new Vector4(1, 1, 0, 1), Color.Blue.ToVector4()),
            new VertexPositionColor(new Vector4(1, -1, 0, 1), Color.Yellow.ToVector4())
        });

        //Position Color Texture
        VertexBuffer2 = Buffer.Create(Device, BindFlags.VertexBuffer, new[] {
            new VertexPositionColorTexture(new Vector4(-1, -1, 0, 1), Color.White.ToVector4(), new Vector2(0,1)),
            new VertexPositionColorTexture(new Vector4(-1, 1, 0, 1), Color.White.ToVector4(),new Vector2(0,0)),
            new VertexPositionColorTexture(new Vector4(1, 1, 0, 1), Color.White.ToVector4(),new Vector2(1,0)),
            new VertexPositionColorTexture(new Vector4(1, -1, 0, 1), Color.White.ToVector4(),new Vector2(1,1))
        });

        IndexBuffer = Buffer.Create(Device, BindFlags.IndexBuffer, new[] {
            0,1,2,
            0,2,3
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多