C#:SharpDX-绘制基本星星

时间:2018-07-14 20:57:52

标签: c# rendering directx-11

问题

几天来我一直在寻找这个问题的答案。我需要帮助,找到一种产生基本恒星的方法。我有随机生成位置的代码;但是,我是DirectX的新手,来自XNAUnity的世界。在最好的情况下,DirectX开发似乎过于复杂。我找到了一些教程,但是,我发现它们很难遵循。清除后,我将无法在屏幕上呈现任何内容。就渲染而言,我正在使用基本设置,但尚未创建任何特殊的类或结构。我一直在尝试遵循3D Game Programming With DirectX 11在书Frank D. Luna中从C ++转换为C#的Richard's Software tutorials。我能够成功完成的最远的任务是清除Color.CornflowerBlue

问题

  1. 是否有任何简单化方法来将对象绘制/渲染到屏幕上,我能够很好地渲染文本,但是图像(子画面)和3D网格似乎给了我一些问题。是否有一种简单的方法来绘制基本的几何形状?例如:Primitives.DrawSphere(float radius, Vector3 location, Color c);
  2. 如果没有可用于绘制图元的简单方法,那么渲染星型的最简单方法是什么?我可以进行球体,带有alpha混合的精灵来模拟距离,广告牌等。最简单的实现方法是什么?
  3. 如何实现上面问题2揭示的最简单的方法?代码示例,教程(没有视频),文章等受到极大的赞赏,因为我很难跟踪良好的C#参考,似乎大多数人都在使用Unity和{ {1}}这些天,但我没有这些选择。

注释

我在政府环境中工作,无法使用未经批准的第三方工具。批准过程是一场噩梦,因此第三方工具通常是不行的。所有提供的答案,文档,样本等均应严格使用Unreal

我的代码

我的项目是一个SharpDX,其主要形式是从WindowsFormsApplicaiton派生的。我创建了一个名为RenderForm的类来处理Engine代码。

Engine.cs:

DirectX

Form1.cs:

internal class Engine : IDisposable {

    #region Fields

    private Device device;
    private SwapChain swapChain;
    private DeviceContext context;
    private Texture2D backBuffer;
    private RenderTargetView renderView;
    private SynchronizationContext syncContext;

    #endregion

    #region Events

    public event EventHandler Draw;
    public event EventHandler Update;
    private void SendDraw(object data) { Draw(this, new EventArgs()); }
    private void SendUpdate(object data) { Update(this, new EventArgs()); }

    #endregion

    #region Constructor(s)

    public Engine(RenderForm form) {
        SwapChainDescription description = new SwapChainDescription() {
            ModeDescription = new ModeDescription(form.Width, form.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
            SampleDescription = new SampleDescription(1, 0),
            Usage = Usage.RenderTargetOutput,
            BufferCount = 1,
            OutputHandle = form.Handle,
            IsWindowed = !form.IsFullscreen
        };
        Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain);
        backBuffer = Resource.FromSwapChain<Texture2D>(swapChain, 0);
        renderView = new RenderTargetView(device, backBuffer);
        context = device.ImmediateContext;
        context.OutputMerger.SetRenderTargets(renderView);
        context.Rasterizer.SetViewport(new Viewport(0, 0, form.Width, form.Height));
        renderForm = form;
    }

    #endregion

    #region Public Methods

    public void Initialize() {
        if (SynchronizationContext.Current != null)
            syncContext = SynchronizationContext.Current;
        else
            syncContext = new SynchronizationContext();

        RenderLoop.Run(renderForm, delegate() {
            context.ClearRenderTargetView(renderView, Color.CornflowerBlue);

            syncContext.Send(SendUpdate, null);
            syncContext.Send(SendDraw, null);

            swapChain.Present(0, 0);
        });
    }
    public void Dispose() { }

    #endregion

}

最后的评论

在此刻,我们将不胜感激,因为它已在第4天开始工作,我仍在努力理解大多数public partial class Form1: RenderForm { private Engine gameEngine; int count = 0; public Form1() { InitializeComponent(); gameEngine = new Engine(this); gameEngine.Update += GameEngine_Update; gameEngine.Draw += GameEngine_Draw; gameEgnine.Initialize(); } private void GameEngine_Update(object sender, EventArgs e) => Debug.WriteLine("Updated."); private void GameEngine_Draw(object sender, EventArgs e) => Debug.WriteLine($"I've drawn {++count} times."); } 代码。我绝不是DirectX 11或开发的新手;我只是习惯了C#Windows FormsASP.NETUnityXNA等。这是我第一次接触WPF及其绝对超过顶部。甚至比十年前我几乎没有任何开发经验时尝试DirectX时还要糟糕。

0 个答案:

没有答案