• 【原创】斌伯的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),和另外一些类,枚举没有谈到。我将在下一篇中发表一下个人的浅见作相应的补充。

  • 相关阅读:
    快照原理及场景
    CEP实时分析模型
    请求响应模式
    JMS消息服务模型
    EMF与GEF
    基于SOA的编程模型
    实时计算CEP
    数据库常见的场景
    自签证书服务加入证书验证
    post提交主订单数据(gateway)实现httpapi
  • 原文地址:https://www.cnblogs.com/alonecat06/p/933519.html
Copyright © 2020-2023  润新知