问题
几天来我一直在寻找这个问题的答案。我需要帮助,找到一种产生基本恒星的方法。我有随机生成位置的代码;但是,我是DirectX
的新手,来自XNA
和Unity
的世界。在最好的情况下,DirectX
开发似乎过于复杂。我找到了一些教程,但是,我发现它们很难遵循。清除后,我将无法在屏幕上呈现任何内容。就渲染而言,我正在使用基本设置,但尚未创建任何特殊的类或结构。我一直在尝试遵循3D Game Programming With DirectX 11
在书Frank D. Luna
中从C ++转换为C#的Richard's Software tutorials。我能够成功完成的最远的任务是清除Color.CornflowerBlue
。
问题
Primitives.DrawSphere(float radius, Vector3 location, Color 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 Forms
,ASP.NET
,Unity
,XNA
等。这是我第一次接触WPF
及其绝对超过顶部。甚至比十年前我几乎没有任何开发经验时尝试DirectX
时还要糟糕。