Direct3D的初始化代码
private void InitializeGraphics()
{
// Set up our presentation parameters
// 将 Presentation Parameters 作为字段变量保存下来:m_presentParams
m_presentParams = new PresentParameters();
m_presentParams.Windowed = true;
m_presentParams.SwapEffect = SwapEffect.Discard;
m_presentParams.AutoDepthStencilFormat =DepthFormat.D16;
m_presentParams.EnableAutoDepthStencil =true;
if(!World.Settings.VSync)
// Disable wait for vertical retrace (higher frame rate at the expense of tearing)
m_presentParams.PresentationInterval =PresentInterval.Immediate;
int adapterOrdinal = 0;
try
{
// Store the default adapter
adapterOrdinal =Manager.Adapters.Default.Adapter;
}
catch
{
// User probably needs to upgrade DirectX or install a 3D capable graphics adapter
throw new NotAvailableException();
}
DeviceType dType =DeviceType.Hardware;
foreach(AdapterInformation aiin Manager.Adapters)
{
// 这里没有看懂
if(ai.Information.Description.IndexOf("NVPerfHUD") >= 0)
{
adapterOrdinal = ai.Adapter;
dType =DeviceType.Reference;
}
}
CreateFlags flags =CreateFlags.SoftwareVertexProcessing;
// Check to see if we can use a pure hardware m_Device3d
Caps caps =Manager.GetDeviceCaps(adapterOrdinal, DeviceType.Hardware);
// Do we support hardware vertex processing?
if(caps.DeviceCaps.SupportsHardwareTransformAndLight)
// // Replace the software vertex processing
flags = CreateFlags.HardwareVertexProcessing;
// Use multi-threading for now -
// TODO: See if the code can be changed such that this isn't necessary (Texture Loading for example)
flags |= CreateFlags.MultiThreaded |CreateFlags.FpuPreserve;
try
{
// Create our m_Device3d
m_Device3d = new Device(adapterOrdinal, dType, this, flags, m_presentParams);
}
catch( Microsoft.DirectX.DirectXException )
{
throw new NotSupportedException("Unable to create the Direct3D m_Device3d.");
}
// Hook the m_Device3d reset event
m_Device3d.DeviceReset += new EventHandler(OnDeviceReset);
m_Device3d.DeviceResizing += new CancelEventHandler(m_Device3d_DeviceResizing);
OnDeviceReset(m_Device3d, null); // 必须首先调用一次
}
private void OnDeviceReset(object sender, EventArgs e)
{
// Can we use anisotropic texture minify filter?
if( m_Device3d.DeviceCaps.TextureFilterCaps.SupportsMinifyAnisotropic)
{
m_Device3d.SamplerState[0].MinFilter =TextureFilter.Anisotropic;
}
else if( m_Device3d.DeviceCaps.TextureFilterCaps.SupportsMinifyLinear)
{
m_Device3d.SamplerState[0].MinFilter =TextureFilter.Linear;
}
// What about magnify filter?
if( m_Device3d.DeviceCaps.TextureFilterCaps.SupportsMagnifyAnisotropic )
{
m_Device3d.SamplerState[0].MagFilter =TextureFilter.Anisotropic;
}
else if( m_Device3d.DeviceCaps.TextureFilterCaps.SupportsMagnifyLinear )
{
m_Device3d.SamplerState[0].MagFilter =TextureFilter.Linear;
}
m_Device3d.SamplerState[0].AddressU = TextureAddress.Clamp;
m_Device3d.SamplerState[0].AddressV = TextureAddress.Clamp;
m_Device3d.RenderState.Clipping = true;
m_Device3d.RenderState.CullMode = Cull.Clockwise;
m_Device3d.RenderState.Lighting = false;
m_Device3d.RenderState.Ambient = World.Settings.StandardAmbientColor;
m_Device3d.RenderState.ZBufferEnable = true;
m_Device3d.RenderState.AlphaBlendEnable =true;
m_Device3d.RenderState.SourceBlend = Blend.SourceAlpha;
m_Device3d.RenderState.DestinationBlend =Blend.InvSourceAlpha;
}
private void m_Device3d_DeviceResizing(object sender,CancelEventArgs e)
{
if(this.Size.Width == 0 ||this.Size.Height == 0)
{
e.Cancel = true;
return;
}
this.drawArgs.screenHeight =this.Height;
this.drawArgs.screenWidth =this.Width;
}