XNA入门(二)Mdirectx框架解析

本文介绍了一个简单的3D渲染程序框架,使用DirectX进行图形渲染。文章详细展示了如何初始化DirectX设备,设置渲染环境,并实现基本的窗口绘制过程。此外,还提供了设备重置和渲染循环的实现方式。

关于程序的基本框架:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;


namespace 基本架构
{
    public partial class Form1 : Form
    {
        private Device device = null;
        bool pause = false;
        
        public Form1()
        {
            InitializeComponent();
        }


        public bool InitializeGraphics()//该方法基本不需要修改
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
//不是全屏显示,在一个窗口显示
                presentParams.SwapEffect = SwapEffect.Discard;
//后备缓存交换的方式
                presentParams.EnableAutoDepthStencil = true;
//允许使用自动深度模板测试
                //深度缓冲区单元为16位二进制数
                presentParams.AutoDepthStencilFormat = DepthFormat.D16;
                device = new Device(0, DeviceType.Hardware, this,
//建立设备类对象
          CreateFlags.SoftwareVertexProcessing, presentParams);
                //设置设备重置事件(device.DeviceReset)事件函数为this.OnResetDevice
                device.DeviceReset += new System.EventHandler(this.OnResetDevice);
                this.OnCreateDevice(device, null);//自定义方法,初始化Device的工作放到这个方法中
                this.OnResetDevice(device, null);//调用设备重置事件(device.DeviceReset)事件函数
            }
//设备重置事件函数要设置Device参数,初始函数中必须调用该函数
            catch (DirectXException)
            {
                return false;
            }
            return true;
        }


        public void OnCreateDevice(object sender, EventArgs e)//仅初始化调用一次,用来创建device中得mesh(3D模型)或者vertexBuffer(自定义多边形)
        { }


        public void OnResetDevice(object sender, EventArgs e)//当使用灯光和材质时,需要补充改方法,主要就是针对窗口调节后的设置复原控制
        { }


        public void Render()
//渲染方法,本方法没有任何渲染代码,可认为是渲染方法的框架
        {
            if (device == null)
//如果未建立设备对象,退出
                return;
            if (pause)
                return;


            //下边函数将显示区域初始化为蓝色,第1个参数指定要初始化目标窗口包括深度缓冲区
            //第2个参数是我们所要填充的颜色。第3、第4个参数一般为1.0f, 0。
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.Blue, 1.0f, 0);
            device.BeginScene();
//开始渲染
            //渲染代码必须放在device.BeginScene()和device.Present()之间
            device.EndScene();
//渲染结束
            device.Present();
//更新显示区域,把后备缓存的3D图形送到屏幕显示区中显示
        }


        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            this.Render();
        }


        private void Form1_Resize(object sender, EventArgs e)
        {
            pause = ((this.WindowState == FormWindowState.Minimized) || !this.Visible);
        }












    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值