【原创】斌伯的DirectX学习笔记(2)DirectX的初始化化(10.19 下午)

Tutorial1--Create a Device
初始化Direct3D,渲染一个蓝色的屏幕

代码如下:

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.0f0);
            
//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(),设定PresentParametersDevice来初始化Direct3D。然后调用Render(),通过Device类有的BeginSence(),EndSence()和Present()三个方法来对屏幕进行渲染,并最终把内容显示在显示器上。

这里涉及到两个重要的类――PresentParametersDevice,接下来就详细的谈谈这两个类。

msdn中列举了PresentParametersDevice的所有属性,方法,我只谈谈现在用到的和一些常用的部分。

PresentParameters  用于设定与将内容呈现到显示器上的相关的参数

属性

Windowed

bool

指示应用程序是否在窗口模式下运行

SwapEffect

enum

设置缓冲区是如何交换(创建交换链Swap Chain的方式)

Multisample

enum

设定多重采样的类型

公共方法

PresentParameters

PresentParameters类的构造函数,无参数

*PresentParameters还有其它很多的属性,如BackBufferWidthBackBufferHeight等名如其意,是设置后台缓冲区,现在还不涉及到,以后深入的会用到,期待有高手补充一下一些后台缓冲区的相关知识。

*SwapEffect:枚举值有三:

Discard:为整数1,交换链本质上是一个队列,其中,0 始终指向将由下一个 Device.Present 操作显示的后台缓冲区,在该操作中,缓冲区在显示后立即被舍弃。使用此交换效果的应用程序应先更新整个后台缓冲区,然后再调用显示该缓冲区的 Device.Present 操作。另外,在为 MultiSample 指定 None 以外的值时,Discard 也是可以使用的唯一的交换效果。

Flip:为整数2,交换链可能包括多个后台缓冲区,它本质上是一个包括前台缓冲区的循环队列。调用Device.Present时会旋转该队列,这样,前台缓冲区就变成后台缓冲区(n - 1),而后台缓冲区0则变成新的前台缓冲区。(其中 n 是后台缓冲区的数目,因此,0 表示最近呈现的缓冲区)

Copy:为整数3,只能为构成单个后台缓冲区的交换链指定此交换效果,具体来说,该操作使后台缓冲区的内容保持不变

这三个值具体含义以及如何使用还要日在深究了。

* Multisamplingnone为禁止多重采样,其余分为116级的多重采样,与之相对应的是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:为整数2Direct3D提供的参考光栅设备,即REF设备

Software:为整数3,软件版本设备

NullReference:为整数4,没有参考光栅设备

相关的差别还是要以后继续学下去,甚至要做项目才能真正明白

Control:此参数指示要绑定到设备的图面

IntPtr:指针结构体,指向非托管的(COMIDirect3DDevice9 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.01.0,为 0.0,表示与查看器的最近距离;如果为 1.0,则表示最远距离

int:要存储在每个模具缓冲区项中的整数值。此参数的范围可以在02n-1之间,其中n是模具缓冲区的位深度

Rectangle[]:一个Rectangle结构的数组,它描述要清除的矩形

 

这里只是粗略的摘录了MSDNDirectX Document中相关的要点,还有一些知识,如前后台缓冲区与Swap Chain的关系,呈现三部曲(BeginSenceEndSencePresent),和另外一些类,枚举没有谈到。我将在下一篇中发表一下个人的浅见作相应的补充。

原文地址:https://www.cnblogs.com/alonecat06/p/933519.html