VC#版DirectX开发入门详解

来源:互联网 发布:mysql中的级联删除 编辑:程序博客网 时间:2024/06/04 00:33

一 首先需要安装DirectX SDK,

可在

http://download.microsoft.com/download/F/1/7/F178BCE4-FA19-428F-BB60-F3DEE1130BFA/DXSDK_Feb10.exe

下载

也可在我的网盘下载:

http://pan.baidu.com/s/1pJmMLHh

 

安装之后在下图目录出现下图内容,这是用于C#的DirectX支持DLL;

 

二 首先拷贝过来一个例子代码调试一下;

出现上图错误,按下图启动工作站服务,

 

 

再调试,可以运行了,但是出现下图错误;

    按网上一些说法,改了一些地方,包括.net版本改为2.0,还是错误,提示只有一句:不是有效的Win32应用程序;既然不好搞,还是不用拷来的例子,自己写吧;

 

新建一个空项目 - 添加新项 窗体;

此时窗体只有一个构造函数,添加Main()函数让程序能运行,如下;

static void Main()
        {
            Form1 basicForm = new Form1(); //创建窗体对象
            basicForm.Show(); //
        }

 

然后添加引用,添加命名空间,如下;

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

先运行一下,结果出现 VS没反应,出现提示对话框:VS正在等待某个操作.... 这个错误,大概不少人碰到过;

工具-选项-IntelliSense,把 IntelliSense成员选择 前面的勾去掉;

    再运行,好了;下面添加DirectX代码;

添加窗体级变量:

Device device = null;//定义绘图设备

 

添加初始化D3D函数:

public bool InitializeDirect3D()
        {
            try
            {
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true; //指定以Windows窗体形式显示
                presentParams.SwapEffect = SwapEffect.Discard; //当前屏幕绘制后它将自动从内存中删除
                device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams); //实例化device对象
                return true;
            }
            catch (DirectXException e)
            {
                MessageBox.Show(e.ToString(), "Error"); //处理异常
                return false;
            }
        }

 

添加渲染函数,此时并无渲染内容;

public void Render()
        {
            if (device == null)   //如果device为空则不渲染
            {
                return;
            }
            device.Clear(ClearFlags.Target, Color.DarkSlateBlue, 1.0f, 0);  //清除windows界面为深蓝色
            device.BeginScene();

            //在此添加渲染图形代码

            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);

            device.EndScene();
            device.Present();
        }

 

main()函数改为如下:

static void Main()
        {
            Form1 basicForm = new Form1(); //创建窗体对象
            if (basicForm.InitializeDirect3D() == false) //检查Direct3D是否启动
            {
                MessageBox.Show("无法启动Direct3D!", "错误!");
                return;
            }
            basicForm.Show(); //如果一切都初始化成功,则显示窗体
            while (basicForm.Created) //设置一个循环用于实时更新渲染状态
            {
                basicForm.Render(); //保持device渲染,直到程序结束
                Application.DoEvents(); //处理键盘鼠标等输入事件
            }
        }

然后再运行,出现下图错误;

 

把.net版本改为2.0;Run,好了,第一个DirectX窗口出现;不过并无内容;

 

下面来画一个基本的三角形;

在BeginScene和EndScene之间加入如下代码;

CustomVertex.TransformedColored[] vertices = new CustomVertex.TransformedColored[3];//定义顶点
            vertices[0].Position = new Vector4(400f, 200f, 0f, 1f);
            vertices[0].Color = Color.Red.ToArgb();
            vertices[1].Position = new Vector4(this.Width / 2, 100f, 0f, 1f);
            vertices[1].Color = Color.Green.ToArgb();
            vertices[2].Position = new Vector4(this.Width - 150f, 200f, 0f, 1f);
            vertices[2].Color = Color.Yellow.ToArgb();

            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);

 

运行程序,结果如下,因为设置的三角形坐标有问题,三角形超出了边界;

 

Vector4结构的前三个参数是指浮点型的x、y、z坐标;

修改坐标为如下,

vertices[0].Position = new Vector4(100f, 200f, 0f, 1f);
            vertices[0].Color = Color.Red.ToArgb();
            vertices[1].Position = new Vector4(this.Width / 2, 50f, 0f, 1f);
            vertices[1].Color = Color.Green.ToArgb();
            vertices[2].Position = new Vector4(this.Width - 150f, 100f, 0f, 1f);
            vertices[2].Color = Color.Yellow.ToArgb();

再RUN,这下好了;下面就可以开始用DirectX做更多的事。

 

项目源码下载:

http://pan.baidu.com/s/1c050hCO

 

 

0 0
原创粉丝点击