[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;

namespace WindowsApplication1
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
            
this.Shown += new EventHandler(Form1_Shown);
        }


        
void Form1_Shown(object sender, EventArgs e)
        
{
            InitDevice(); 
            LoadTexture(); 
            Draw();
        }


        
private Texture texture;
        
private Sprite sprite;
        
private Device device;

        
/// <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);

            
//常识:不Clear的话,没有被帖上图的地方会很美丽。
            device.Clear(ClearFlags.Target, Color.Black, 00);

        }


        
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(000), Color.White);
            
            sprite.End();
            device.EndScene();
            device.Present();
        }

    }

}


需要说明一点,这个程序关闭的时候会Crash。只要窗口关闭的时候销毁对象即可解决这个错误。

可以很明显的看出,到这里为止我们已经可以像以往一样开始2D操作了。那么这次到此为止,下次是产生移动的帧动画和即时绘制几何图形以及写字。
posted @ 2005-11-28 13:14  Cloudage  阅读(2317)  评论(2编辑  收藏  举报