今天心血来潮,看了一下DirectX的编程,对于根本没有过DirectX知识的我肯定是去找Tutorial了,微软自带的,现在我们就看看第一个Tutorial1。
要使用它当然第一步要为他弄一个设备让他有地方住下,虽然我们国家不是很富裕当然住的地方还是有的,Device就是提供他们住的地方。这个类中有4个重载:
public Device(IDirect3DDevice9* pUnk);
public Device(IntPtr unmanagedObject);
public Device(int adapter, DeviceType deviceType, Control renderWindow, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);
public Device(int adapter, DeviceType deviceType, IntPtr renderWindowHandle, CreateFlags behaviorFlags, params PresentParameters[] presentationParameters);
有些怪怪的哦,根本不知道他们是干什么用的,下面来看看关于他的一些传说J:
从上面我们可以看到有一个叫adapter的家伙一直顶在前头,他表示我们将要使用哪个物理图形卡,一般用0;
DeviceType不用多说也知道是要创建那种类型的Device:
public enum DeviceType
{
Hardware = 1,
Reference = 2,
Software = 3,
NullReference = 4,
}
renderWindowHandle就是要把这个设备捆绑到哪个窗口上;
behaviorFlags在设备创建之后的行为,是Flags枚举:
[Flags]
public enum CreateFlags
{
FpuPreserve = 2,
MultiThreaded = 4,
PureDevice = 16,
SoftwareVertexProcessing = 32,
HardwareVertexProcessing = 64,
MixedVertexProcessing = 128,
DisableDriverManagement = 256,
AdapterGroupDevice = 512,
DisableDriverManagementEx = 1024,
NoWindowChanges = 2048,
}
presentationParameters设备把数据呈现到显示器的方式,有N多个参数:
其中有一个属性public bool Windowed,如果将其设为true则表示窗口模式。
(注:由于本人也是一知半解中,多有些参数也还是不知道她的用处,先留着她,等以后用到时再来…)
回到我们的例子中,我们可以看到首先声明了一个全局变量Device devic=null;然后就创建这个设备,在下面的代码我们可以看到设备的创建其实也不难:
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;
}
}
上面还有一个没说的就是presentParams.SwapEffect = SwapEffect.Discard;这个是虾米易素呢?根据情报了解到SwapEffect成员是用于控制缓存交换的行为,如果选择了SwapEffect.Flip,运行时会创建额外的后备缓冲。
private void Render()
{
if (device == null)
return;
//Clear the backbuffer to a blue color
device.Clear(ClearFlags.Target, System.Drawing.Color.Blue,
//Begin the scene
device.BeginScene();
// Rendering of scene objects can happen here
//End the scene
device.EndScene();
device.Present();
}
这个函数才是关键所在阿,Render(在ASP.NET中应该每个页面都有这个栋栋,来呈现HTML元素。)是渲染的入口点,每一帧渲染都要调用这个函数。BeginScene()/EndScene()函数对,分别在渲染前后调用。BeginScene()会使系统检查内部数据结构和渲染表面的可用性有效性。这里在BeginScene()/EndScene() 中间没有做任何事情,所以就没有什么被渲染,这个例子可以被当作模板使用。