Tutorial1--Create a Device
初始化Direct3D,渲染一个蓝色的屏幕
代码如下:
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();
}
}
}
}
}
程序引用到“Microsoft.DirectX”和“Microsoft.DirectX.Direct3D”两个命名空间。首先,程序运行InitializeGraphics(),设定PresentParameters和Device来初始化Direct3D。然后调用Render(),通过Device类有的BeginSence(),EndSence()和Present()三个方法来对屏幕进行渲染,并最终把内容显示在显示器上。
这里涉及到两个重要的类――PresentParameters和Device,接下来就详细的谈谈这两个类。
在msdn中列举了PresentParameters和Device的所有属性,方法,我只谈谈现在用到的和一些常用的部分。
PresentParameters 用于设定与将内容呈现到显示器上的相关的参数 |
||
属性 |
||
Windowed |
bool |
指示应用程序是否在窗口模式下运行 |
SwapEffect |
enum |
设置缓冲区是如何交换(创建交换链Swap Chain的方式) |
Multisample |
enum |
设定多重采样的类型 |
公共方法 |
||
PresentParameters |
PresentParameters类的构造函数,无参数 |
*PresentParameters还有其它很多的属性,如BackBufferWidth,BackBufferHeight等名如其意,是设置后台缓冲区,现在还不涉及到,以后深入的会用到,期待有高手补充一下一些后台缓冲区的相关知识。
*SwapEffect:枚举值有三:
Discard:为整数1,交换链本质上是一个队列,其中,0 始终指向将由下一个 Device.Present 操作显示的后台缓冲区,在该操作中,缓冲区在显示后立即被舍弃。使用此交换效果的应用程序应先更新整个后台缓冲区,然后再调用显示该缓冲区的 Device.Present 操作。另外,在为 MultiSample 指定 None 以外的值时,Discard 也是可以使用的唯一的交换效果。
Flip:为整数2,交换链可能包括多个后台缓冲区,它本质上是一个包括前台缓冲区的循环队列。调用Device.Present时会旋转该队列,这样,前台缓冲区就变成后台缓冲区(n - 1),而后台缓冲区0则变成新的前台缓冲区。(其中 n 是后台缓冲区的数目,因此,0 表示最近呈现的缓冲区)
Copy:为整数3,只能为构成单个后台缓冲区的交换链指定此交换效果,具体来说,该操作使后台缓冲区的内容保持不变
这三个值具体含义以及如何使用还要日在深究了。
* Multisampling:none为禁止多重采样,其余分为1到16级的多重采样,与之相对应的是int型的MultiSampleQuality属性
Device 执行基于基元的呈现,创建资源,处理系统级变量,获取和设置调色板,创建阴影 |
||
属性 |
||
公共方法 |
||
Device |
Device类的构造函数, |
|
Clear |
void |
将视区或视区中的一组矩形清除为指定的 RGBA 颜色,清除深度缓冲区并清除模具缓冲区 |
BeginScene |
void |
开始场景 |
EndScene |
void |
结束通过调用 BeginScene 方法开始的场景,当 EndScene 成功时,该场景将进入由驱动程序进行呈现的队列中 |
Present |
void |
从下一个后台缓冲区中取出内容,提交到显示器上呈现 |
*其实Device的属性还蛮多的,不过就初学而言,还没涉及到,以后肯要在回来补充一下
* Device方法有多个参数,其中有:
public Device(IDirect3DDevice9);
public Device(int, DeviceType, Control, CreateFlags, PresentParameters[]);
public Device(int, DeviceType, IntPtr, CreateFlags, PresentParameters[]);
public Device(IntPtr);
IDirect3DDevice9:是struct,允许托管的API访问非托管的Microsoft DirectX API(在c#中较少使用,但是在C++中十分常见)
int:一个标识对象表示哪个物理设备的序号。设备0表示默认设备。在此参数中可使用的最大值为物理设备总数减1
DeviceType:是enum,表示所需的设备类型
Hardware:为整数1,硬件实现的参考光栅设备(reference rasterizer device)
Reference:为整数2,Direct3D提供的参考光栅设备,即REF设备
Software:为整数3,软件版本设备
NullReference:为整数4,没有参考光栅设备
相关的差别还是要以后继续学下去,甚至要做项目才能真正明白
Control:此参数指示要绑定到设备的图面
IntPtr:指针结构体,指向非托管的(COM)IDirect3DDevice9 interface
CreateFlags:是enum,定义在所创建设备的类型,其中两个常用的:
HardwareVertexProcessing:为整数64,指定硬件实现顶点运算
SoftwareVertexProcessing:为整数32,指定软件实现顶点运算
PresentParameters[]:描述要创建的设备的表示参数,但为何是数组呢?
*Clear方法有多个参数,其中有:
Clear(ClearFlags, Color, float, int);
Clear(ClearFlags, Color, float, int, Rectangle[]);
Clear(ClearFlags, int, float, int);
Clear(ClearFlags, int, float, int, Rectangle[]);
ClearFlags:是enum,指定调用Clear方法时要使用的缓冲区,此参数可以是下列枚举的任意组合
Stencil:为整数4,缓冲区指定为模具数据的缓冲区
Target:为整数1,缓冲区指定为渲染目标
ZBuffer:为整数2,缓冲区指定为用于存储场景中每个像素的深度值的缓冲区
Color:表示将呈现目标图面清除为的颜色
float:此方法存储在深度缓冲区中的新zdepth值,值从0.0到1.0,为 0.0,表示与查看器的最近距离;如果为 1.0,则表示最远距离
int:要存储在每个模具缓冲区项中的整数值。此参数的范围可以在0到2n-1之间,其中n是模具缓冲区的位深度
Rectangle[]:一个Rectangle结构的数组,它描述要清除的矩形
这里只是粗略的摘录了MSDN和DirectX Document中相关的要点,还有一些知识,如前后台缓冲区与Swap Chain的关系,呈现三部曲(BeginSence,EndSence,Present),和另外一些类,枚举没有谈到。我将在下一篇中发表一下个人的浅见作相应的补充。