//
-----------------------------------------------------------------------------
//
?File:?CreateDevice.cs
//
//
?Desc:?This?is?the?first?tutorial?for?using?Direct3D.?In?this?tutorial,?all
//
???????we?are?doing?is?creating?a?Direct3D?device?and?using?it?to?clear?the
//
???????window.
//
//
?Copyright?(c)?Microsoft?Corporation.?All?rights?reserved.
//
-----------------------------------------------------------------------------
using
?System;
using
?System.Drawing;
using
?System.Windows.Forms;
using
?Microsoft.DirectX;
using
?Microsoft.DirectX.Direct3D;

namespace
?DeviceTutorial

{
????
public
?
class
?CreateDevice?:?Form

????
{
????????
//
?Our?global?variables?for?this?project
????????Device?device?
=
?
null
;?
//
?Our?rendering?device
????????
public
?CreateDevice()

????????
{
????????????
//
?Set?the?initial?size?of?our?form
????????????
this
.ClientSize?
=
?
new
?System.Drawing.Size(
400
,
300
);
????????????
//
?And?it's?caption
????????????
this
.Text?
=
?
"
D3D?Tutorial?01:?CreateDevice
"
;
????????}
????????
????????
public
?
bool
?InitializeGraphics()

????????
{
????????????
try
????????????
{
????????????????
//
?Now?let's?setup?our?D3D?stuff
????????????????PresentParameters?presentParams?
=
?
new
?PresentParameters();
????????????????presentParams.Windowed
=
true
;
????????????????presentParams.SwapEffect?
=
?SwapEffect.Discard;
????????????????device?
=
?
new
?Device(
0
,?DeviceType.Hardware,?
this
,?CreateFlags.SoftwareVertexProcessing,?presentParams);
????????????????
return
?
true
;
????????????}
????????????
catch
?(DirectXException)

????????????
{?
????????????????
return
?
false
;?
????????????}
????????}
????????
private
?
void
?Render()

????????
{
????????????
if
?(device?
==
?
null
)?
????????????????
return
;

????????????
//
Clear?the?backbuffer?to?a?blue?color?
????????????device.Clear(ClearFlags.Target,?System.Drawing.Color.Blue,?
1.0f
,?
0
);
????????????
//
Begin?the?scene
????????????device.BeginScene();
????????????
????????????
//
?Rendering?of?scene?objects?can?happen?here
????
????????????
//
End?the?scene
????????????device.EndScene();
????????????device.Present();
????????}
????????
protected
?
override
?
void
?OnPaint(System.Windows.Forms.PaintEventArgs?e)

????????
{
????????????
this
.Render();?
//
?Render?on?painting
????????}
????????
protected
?
override
?
void
?OnKeyPress(System.Windows.Forms.KeyPressEventArgs?e)

????????
{
????????????
if
?((
int
)(
byte
)e.KeyChar?
==
?(
int
)System.Windows.Forms.Keys.Escape)
????????????????
this
.Close();?
//
?Esc?was?pressed
????????}
????????
/**/
///
?
<summary>
????????
///
?The?main?entry?point?for?the?application.
????????
///
?
</summary>
????????
static
?
void
?Main()?

????????
{

????????????
using
?(CreateDevice?frm?
=
?
new
?CreateDevice())

????????????
{
????????????????
if
?(
!
frm.InitializeGraphics())?
//
?Initialize?Direct3D
????????????????
{
????????????????????MessageBox.Show(
"
Could?not?initialize?Direct3D.??This?tutorial?will?exit.
"
);
????????????????????
return
;
????????????????}
????????????????frm.Show();

????????????????
//
?While?the?form?is?still?valid,?render?and?process?messages
????????????????
while
(frm.Created)

????????????????
{
????????????????????frm.Render();
????????????????????Application.DoEvents();
????????????????}
????????????}
????????}
????}
}
1 creating the Direct3D device
??
PresentParameters object that is used to set the windows display characteristics.????? presentParameters 用來設置windows的特征. 她的windowed設為? true? 表示以窗口顯示,沒有菜單和子窗口,但是有最大,最小和關閉button.
2 Device的構造函數中,指定了hardware device是優先的,頂點的處理有軟件來處理.但是如果我們有好的顯卡且我們設置
?CreateFlags.
HardwareVertexProcessing參數,則我們有更好的性能.
3 ?Application.DoEvents(); 不能沒有,否則窗口不接受消息,一直render().
4
Device.
Clear method使窗口顏色被設置為blue.
Device.
BeginScene則真正開始render. the
EndScene and
Present methods 表示完成render.
包含檢查硬件的支持:
//------------------------------------------------------------------------------
//???????????Name:?dx9cs_initialization.cs
//?????????Author:?Kevin?Harris
//??Last?Modified:?06/15/05
//????Description:?This?sample?demonstrates?how?to?initialize?Direct3D.
//------------------------------------------------------------------------------

using?System;
using?System.Drawing;
using?System.Windows.Forms;
using?Microsoft.DirectX;
using?Microsoft.DirectX.Direct3D;

namespace?DX9Sample


{
????public?class?DX9Form?:?System.Windows.Forms.Form

????
{
????????private?Device?d3dDevice?=?null;

????????public?DX9Form()

????????
{
????????????this.ClientSize?=?new?System.Drawing.Size(?640,?480?);
????????????this.Text?=?"Direct3D?(DX9/C#)?-?Initialization";
????????????this.SetStyle(?ControlStyles.AllPaintingInWmPaint?|?ControlStyles.Opaque,?true?);
????????}

????????protected?override?void?OnPaint(System.Windows.Forms.PaintEventArgs?e)

????????
{
????????????this.Render();
????????????this.Invalidate();
????????}

????????protected?override?void?OnKeyDown(System.Windows.Forms.KeyEventArgs?e)

????????
{
????????????switch(?e.KeyCode?)

????????????
{
????????????????case?System.Windows.Forms.Keys.Escape:
????????????????????this.Dispose();
????????????????????break;
????????????}
????????}

????????protected?override?void?Dispose(bool?disposing)

????????
{
????????????base.Dispose(?disposing?);
????????}

????????static?void?Main()?

????????
{
????????????using(?DX9Form?frm?=?new?DX9Form()?)

????????????
{
????????????????frm.Show();
????????????????frm.Init();
????????????????Application.Run(?frm?);
????????????}
????????}


????????/**////?<summary>
????????///?This?method?basically?creates?and?initialize?the?Direct3D?device?and
????????///?anything?else?that?doens't?need?to?be?recreated?after?a?device?
????????///?reset.
????????///?</summary>
????????private?void?Init()?

????????
{
????????????//?Does?the?hardware?support?a?16-bit?z-buffer?
????????????if(?!Manager.CheckDeviceFormat(?Manager.Adapters.Default.Adapter,?
???????????????????????????????????????????DeviceType.Hardware,
???????????????????????????????????????????Manager.Adapters.Default.CurrentDisplayMode.Format,?
???????????????????????????????????????????Usage.DepthStencil,
???????????????????????????????????????????ResourceType.Surface,
???????????????????????????????????????????DepthFormat.D16?)?)

????????????
{
????????????????//?POTENTIAL?PROBLEM:?We?need?at?least?a?16-bit?z-buffer!
????????????????return;
????????????}

????????????//
????????????//?Do?we?support?hardware?vertex?processing??if?so,?use?it.?
????????????//?If?not,?downgrade?to?software.
????????????//

????????????Caps?caps?=?Manager.GetDeviceCaps(?Manager.Adapters.Default.Adapter,?
???????????????????????????????????????????????DeviceType.Hardware?);
????????????CreateFlags?flags;

????????????if(?caps.DeviceCaps.SupportsHardwareTransformAndLight?)
????????????????flags?=?CreateFlags.HardwareVertexProcessing;
????????????else
????????????????flags?=?CreateFlags.SoftwareVertexProcessing;

????????????//
????????????//?Everything?checks?out?-?create?a?simple,?windowed?device.
????????????//

????????????PresentParameters?d3dpp?=?new?PresentParameters();

????????????d3dpp.BackBufferFormat???????=?Format.Unknown;
????????????d3dpp.SwapEffect?????????????=?SwapEffect.Discard;
????????????d3dpp.Windowed???????????????=?true;
????????????d3dpp.EnableAutoDepthStencil?=?true;
????????????d3dpp.AutoDepthStencilFormat?=?DepthFormat.D16;
????????????d3dpp.PresentationInterval???=?PresentInterval.Immediate;?

????????????d3dDevice?=?new?Device(?0,?DeviceType.Hardware,?this,?flags,?d3dpp?);

????????????//?Register?an?event-handler?for?DeviceReset?and?call?it?to?continue
????????????//?our?setup.
????????????d3dDevice.DeviceReset?+=?new?System.EventHandler(?this.OnResetDevice?);
????????????OnResetDevice(?d3dDevice,?null?);
????????}


????????/**////?<summary>
????????///?This?event-handler?is?a?good?place?to?create?and?initialize?any?
????????///?Direct3D?related?objects,?which?may?become?invalid?during?a?
????????///?device?reset.
????????///?</summary>
????????public?void?OnResetDevice(object?sender,?EventArgs?e)

????????
{
????????????//?This?sample?doens't?create?anything?that?requires?recreation?
????????????//?after?the?DeviceReset?event.
????????}

????????private?void?Render()

????????
{
????????????d3dDevice.Clear(?ClearFlags.Target?|?ClearFlags.ZBuffer,?
?????????????????????????????Color.FromArgb(255,?0,?255,?0),?1.0f,?0?);

????????????d3dDevice.BeginScene();
????????????
????????????//?Render?geometry?here
????
????????????d3dDevice.EndScene();

????????????d3dDevice.Present();
????????}
????}
}
