[1]用D3D进行2D渲染的一个方法。
微软在dx7以后就给DirectDraw亮了黄牌,并建议我们用D3D+Sprite+Texture的方式来渲染2D场景。oct的sdk里就唯一的一个2d例子就是用的这种方法,然而微软的一贯风格是严谨并庞大,所以我没能全部看懂。以下是从中得出的一些重点。
正如前面所言,首先需要三个东西:Device、Texture、Sprite。如果有GDI+经验,不妨这样理解:Device相当于控件,Sprite相当于Graphic。渲染的步骤无非如此:创建Device,创建Sprite,读取Texture,用Sprite画Texture,更新Device。
下面给出一段代码。这段代码是最简的,可以简单的用来帖一张图。希望能够对厌倦了微软长篇大论的人有一点帮助。
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
![](/Images/OutliningIndicators/None.gif)
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Shown += new EventHandler(Form1_Shown);
}
![](/Images/OutliningIndicators/InBlock.gif)
void Form1_Shown(object sender, EventArgs e)
{
InitDevice();
LoadTexture();
Draw();
}
![](/Images/OutliningIndicators/InBlock.gif)
private Texture texture;
private Sprite sprite;
private Device device;
![](/Images/OutliningIndicators/InBlock.gif)
/// <summary>
/// 初始化设备和Device
/// </summary>
private void InitDevice()
{
PresentParameters[] PP = new PresentParameters[1];
PP[0] = new PresentParameters();
// 这里是窗口模式,如果想要全屏的话需要设置分辨率、缓冲区和刷新率等。
PP[0].Windowed = true;
PP[0].SwapEffect = SwapEffect.Discard;
device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, PP);
sprite = new Sprite(device);
![](/Images/OutliningIndicators/InBlock.gif)
//常识:不Clear的话,没有被帖上图的地方会很美丽。
device.Clear(ClearFlags.Target, Color.Black, 0, 0);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
private void LoadTexture()
{
//这个方法有一长串参数。这里仅仅用了最简单的方法。在需要用到透明色之类的实际情况下必须
//将参数全部填满。另外,理所当然texture可以有很多个,但还是不建议造很多。
texture = TextureLoader.FromFile(device, @"d:\md3dsp\beetle48.BMP");
}
//通常情况下这个东西得放在游戏循环里。
private void Draw()
{
device.BeginScene();
sprite.Begin(SpriteFlags.AlphaBlend);
//第二个参数是贴图的尺寸,Empty表示贴上整个Texture。
//第四个参数表示贴图位置,也就是贴到目标的什么地方。
sprite.Draw(texture, Rectangle.Empty, new Vector3(0,0,0), new Vector3(0, 0, 0), Color.White);
sprite.End();
device.EndScene();
device.Present();
}
}
}
需要说明一点,这个程序关闭的时候会Crash。只要窗口关闭的时候销毁对象即可解决这个错误。
可以很明显的看出,到这里为止我们已经可以像以往一样开始2D操作了。那么这次到此为止,下次是产生移动的帧动画和即时绘制几何图形以及写字。
正如前面所言,首先需要三个东西:Device、Texture、Sprite。如果有GDI+经验,不妨这样理解:Device相当于控件,Sprite相当于Graphic。渲染的步骤无非如此:创建Device,创建Sprite,读取Texture,用Sprite画Texture,更新Device。
下面给出一段代码。这段代码是最简的,可以简单的用来帖一张图。希望能够对厌倦了微软长篇大论的人有一点帮助。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
需要说明一点,这个程序关闭的时候会Crash。只要窗口关闭的时候销毁对象即可解决这个错误。
可以很明显的看出,到这里为止我们已经可以像以往一样开始2D操作了。那么这次到此为止,下次是产生移动的帧动画和即时绘制几何图形以及写字。