代码的对比directx9

我是是个程序设计的爱好者,大学期间是学计算机的后来去当服务员了,我把一段C++代码转成了C#希望能给需要朋友点提示,希望大家留言指出我的问题。我会继续发表文章,关于3D。这个程序只是简单的现实两个多边行,锥形沿着Y轴旋转,正矩形沿着X轴旋转。C++directx8例子出自《Visual C++ OpenGL DirectX 三维动画编程宝典》,不错的一本书。

C#代码 directx9 managed

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

namespace WindowsApplication2
{
 /// <summary>
 /// Form1 的摘要说明。
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  Device device=null;
  VertexBuffer VB=null;
  PresentParameters presentpara=new PresentParameters();
  bool pause = false;
  /// <summary>
  /// 必需的设计器变量。
  /// </summary>
  private System.ComponentModel.Container components = null;

  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();
   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }
  public void OnResetDevice(object obj,EventArgs e)
  {
   Device dev = (Device)obj;
   device.RenderState.CullMode=Cull.None;
   device.RenderState.ZBufferEnable = true;
   device.RenderState.Lighting = false;
  }
  public void OnCreateDevice(object obj,EventArgs e)
  {
   Device dev=(Device)obj;
   VB=new VertexBuffer(typeof(CustomVertex.PositionColored), 42, dev, Usage.WriteOnly, CustomVertex.PositionColored.Format, Pool.Default);
   VB.Created+=new EventHandler(this.OnCreateVertexBuffer);
   this.OnCreateVertexBuffer(VB,null);
  }
  public void OnCreateVertexBuffer(object obj, EventArgs e)
  {
   VertexBuffer vb = (VertexBuffer)obj;
   CustomVertex.PositionColored[]  verts = (CustomVertex.PositionColored[])vb.Lock(0,0);
   verts[0].Position = new Vector3(0,1,0);
   verts[0].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();//System.Drawing.Color.FromArgb(0,255,255,0);
   //{  0.0f,  1.0f, 0.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[1].Position = new Vector3(1,-1,-1);
   verts[1].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{  1.0f, -1.0f,-1.0f, 0x0000FF00 },
   verts[2].Position = new Vector3(-1,-1,-1);
   verts[2].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{ -1.0f, -1.0f,-1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[3].Position = new Vector3(-1,-1,1);
   verts[3].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{ -1.0f, -1.0f, 1.0f, 0x0000FF00 },
   verts[4].Position = new Vector3(1,-1,1);
   verts[4].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
  // {  1.0f, -1.0f, 1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[5].Position = new Vector3(1,-1,-1);
   verts[5].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{  1.0f, -1.0f,-1.0f, 0x0000FF00 },
   verts[6].Position = new Vector3(-1,-1,-1);
   verts[6].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{ -1.0f, -1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); }, 
   verts[7].Position = new Vector3(-1,1,-1);
   verts[7].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{ -1.0f,  1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[8].Position = new Vector3(1,1,-1);
   verts[8].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{  1.0f,  1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[9].Position = new Vector3(1,1,-1);
   verts[9].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
  // {  1.0f,  1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[10].Position = new Vector3(1,-1,-1);
   verts[10].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{  1.0f, -1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[11].Position = new Vector3(-1,-1,-1);
   verts[11].Color=System.Drawing.Color.Cornsilk.ToArgb();;//new System.Drawing.Color.FromArgb(0,0,0,255);
   //{ -1.0f, -1.0f, -1.0f, System.Drawing.Color.Cornsilk.ToArgb(); },
   verts[12].Position = new Vector3(1,-1,1);
   verts[12].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{  1.0f, -1.0f,  1.0f, 0x0000FF00 }, 
   verts[13].Position = new Vector3(1,1,1);
   verts[13].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
  // {  1.0f,  1.0f,  1.0f, 0x0000FF00 },
   verts[14].Position = new Vector3(-1,1,1);
   verts[14].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{ -1.0f,  1.0f,  1.0f, 0x0000FF00 },
   verts[15].Position = new Vector3(-1,1,1);
   verts[15].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{ -1.0f,  1.0f,  1.0f, 0x0000FF00 },
   verts[16].Position = new Vector3(-1,-1,1);
   verts[16].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
  // { -1.0f, -1.0f,  1.0f, 0x0000FF00 },
   verts[17].Position = new Vector3(1,-1,1);
   verts[17].Color=System.Drawing.Color.MediumOrchid.ToArgb();//new System.Drawing.Color.FromArgb(0,0,255,0);
   //{  1.0f, -1.0f,  1.0f, 0x0000FF00 },
   verts[18].Position = new Vector3(-1,1,-1);
   verts[18].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
  // { -1.0f,  1.0f, -1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[19].Position = new Vector3(-1,1,1);
   verts[19].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
   //{ -1.0f,  1.0f,  1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[20].Position = new Vector3(1,1,1);
   verts[20].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
   //{  1.0f,  1.0f,  1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[21].Position = new Vector3(1,1,1);
   verts[21].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
   //{  1.0f,  1.0f,  1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[22].Position = new Vector3(1,1,-1);
   verts[22].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
  // {  1.0f,  1.0f, -1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[23].Position = new Vector3(-1,1,-1);
   verts[23].Color=System.Drawing.Color.DarkGoldenrod.ToArgb();;//new System.Drawing.Color.FromArgb(0,255,0,0);
   //{ -1.0f,  1.0f, -1.0f, System.Drawing.Color.DarkGoldenrod.ToArgb(); },
   verts[24].Position = new Vector3(1,-1,-1);
   verts[24].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
   //{  1.0f, -1.0f, -1.0f, 0x00FFFF00 }, 
   verts[25].Position = new Vector3(1,-1,1);
   verts[25].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
 //  {  1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   verts[26].Position = new Vector3(-1,-1,1);
   verts[26].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
  // { -1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   verts[27].Position = new Vector3(-1,-1,1);
   verts[27].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
  // { -1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   verts[28].Position = new Vector3(-1,-1,-1);
   verts[28].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
   //{ -1.0f, -1.0f, -1.0f, 0x00FFFF00 },
   verts[29].Position = new Vector3(1,-1,-1);
   verts[29].Color=0x00FFFF00;//new System.Drawing.Color.FromArgb(0,255,255,0);
  // {  1.0f, -1.0f, -1.0f, 0x00FFFF00 },
   verts[30].Position = new Vector3(-1,-1,1);
   verts[30].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f, -1.0f,  1.0f, 0x00FF00FF }, 
   verts[31].Position = new Vector3(-1,1,1);
   verts[31].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f,  1.0f,  1.0f, 0x00FF00FF },
   verts[32].Position = new Vector3(-1,1,-1);
   verts[32].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f,  1.0f, -1.0f, 0x00FF00FF },
   verts[33].Position = new Vector3(-1,1,-1);
   verts[33].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f,  1.0f, -1.0f, 0x00FF00FF },
   verts[34].Position = new Vector3(-1,-1,-1);
   verts[34].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f, -1.0f, -1.0f, 0x00FF00FF },
   verts[35].Position = new Vector3(-1,-1,1);
   verts[35].Color=0x00FF00FF;//new System.Drawing.Color.FromArgb(0,255,0,255);
   //{ -1.0f, -1.0f,  1.0f, 0x00FF00FF },
   verts[36].Position = new Vector3(1,-1,-1);
   verts[36].Color=0x0000FFFF; //new System.Drawing.Color.FromArgb(0,0,255,255);
 //  {  1.0f, -1.0f, -1.0f, 0x0000FFFF }, 
   verts[37].Position = new Vector3(1,1,-1);
   verts[37].Color=0x0000FFFF;//new System.Drawing.Color.FromArgb(0,0,255,255);
  // {  1.0f,  1.0f, -1.0f, 0x0000FFFF },
   verts[38].Position = new Vector3(1,1,1);
   verts[38].Color=0x0000FFFF;//new System.Drawing.Color.FromArgb(0,0,255,255);
   //{  1.0f,  1.0f,  1.0f, 0x0000FFFF },
   verts[39].Position = new Vector3(1,1,1);
   verts[39].Color=0x0000FFFF;//new System.Drawing.Color.FromArgb(0,0,255,255);
   //{  1.0f,  1.0f,  1.0f, 0x0000FFFF },
   verts[40].Position = new Vector3(1,-1,1);
   verts[40].Color=0x0000FFFF;//new System.Drawing.Color.FromArgb(0,0,255,255);
   //{  1.0f, -1.0f,  1.0f, 0x0000FFFF },
   verts[41].Position = new Vector3(1,-1,-1);
   verts[41].Color=0x0000FFFF;//new System.Drawing.Color.FromArgb(0,0,255,255);
  // {  1.0f, -1.0f, -1.0f, 0x0000FFFF },
   VB.Unlock();
  }
  public void screne()
  {
   if(pause)
    return;
   device.Clear(ClearFlags.Target|ClearFlags.ZBuffer, System.Drawing.Color.Blue, 1.0f, 0);
   Matrix sp_matrix=new Matrix();
   Matrix rot_matrix=new Matrix();   
   Matrix trans_matrix=new Matrix();
            Matrix transp_matrix=new Matrix();
   ///
   //static float rot_triangle=0;
   //static float rot_square=0;  
   //rot_triangle+=0.004f;
   //rot_square+=0.007f;
   
   device.BeginScene();
   device.SetStreamSource(0,VB,0);
   device.VertexFormat=CustomVertex.PositionColored.Format;
   rot_matrix.RotateY( Environment.TickCount / 500.0f);
   trans_matrix.Translate(-1.5f,0f,1f);
         rot_matrix.Multiply(trans_matrix);
   device.Transform.World=rot_matrix;
   device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 4);
   //device.Transform.World=Matrix.RotationAxis(new Vector3(0,1,0), Environment.TickCount / 3000.0f);
   //device.Transform.World=Matrix.RotationX(0.04f);
   sp_matrix.RotateX( 300.0f);//Environment.TickCount / 300.0f);
   transp_matrix.Translate(1.5f,0f,1f);
   sp_matrix.Multiply(transp_matrix);
   device.Transform.World=sp_matrix;
   device.DrawPrimitives(PrimitiveType.TriangleList, 6,16);
   device.Transform.View = Matrix.LookAtLH( new Vector3( 0, 0,-9f ), new Vector3( 0, 0, 0 ), new Vector3( 0.0f, 1.0f, 0.0f ) );
   device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4.0f, 1.0f, 1.0f, 100.0f );
   device.EndScene();
   device.Present();
  }
  #region Windows 窗体设计器生成的代码
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
   this.components = new System.ComponentModel.Container();
   this.Size = new System.Drawing.Size(300,300);
   this.Text = "my 3D vertex";
  }
  #endregion
  public bool InitializeGraphics()
  {
   try
   {
    presentpara.Windowed=true;
    presentpara.SwapEffect=SwapEffect.Discard;
    presentpara.EnableAutoDepthStencil=true;
    presentpara.AutoDepthStencilFormat=DepthFormat.D16;
    device=new Device(0,DeviceType.Hardware,this,CreateFlags.SoftwareVertexProcessing,presentpara);
    device.DeviceReset+=new System.EventHandler(this.OnResetDevice);
    this.OnCreateDevice(device,null);
    this.OnResetDevice(device,null);
    pause=false;
    return true;
   }
   catch
   {
    return false;
   }
  }

  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
  {
   this.screne(); // Render on painting
  }
  protected override void OnResize(System.EventArgs e)
  {
   pause = ((this.WindowState == FormWindowState.Minimized) || !this.Visible);
  }
  static void Main()
  {
   using (Form1 frm = new Form1())
   {
    if (!frm.InitializeGraphics()) // Initialize Direct3D
    {
      MessageBox.Show("Could not initialize Direct3D.  This tutorial will exit.");
      return;
    }
                MessageBox.Show((Environment.TickCount/30000f).ToString());
    frm.Show();

    // While the form is still valid, render and process messages
    while(frm.Created)
    {
     frm.screne();
     Application.DoEvents();
    }
   }
   //Application.Run(new Form1());
  }
 }
}
C++ directx8

#include <windows.h>
#include <D3DX8.h>

HWND  hWnd;
HDC   hDC;
HINSTANCE hInstance;  //得到程序的例子

LPDIRECT3D8 P_D3D;
LPDIRECT3DDEVICE8 p_D3DDevice;

RECT  rect;

int   sw = 640;
int   sh = 480;
 
bool  fullscreen  = 1;

//声名一个结构,控制一个顶点的所有信息
struct my_vertex{
    FLOAT x, y, z;   //顶点的非变换位置
    DWORD color;     //顶点的颜色.
};

//一个用来定义顶点的宏'macro'
#define D3D8T_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)


//三角形和矩形的顶点坐标及颜色值
my_vertex g_vertices[] ={
    {  0.0f,  1.0f, 0.0f, 0x00FF0000 },
   {  1.0f, -1.0f,-1.0f, 0x0000FF00 },
   { -1.0f, -1.0f,-1.0f, 0x000000FF },

   { -1.0f, -1.0f, 1.0f, 0x0000FF00 },

   {  1.0f, -1.0f, 1.0f, 0x000000FF },
   {  1.0f, -1.0f,-1.0f, 0x0000FF00 },
   { -1.0f, -1.0f, -1.0f, 0x000000FF }, 
   { -1.0f,  1.0f, -1.0f, 0x000000FF },
   {  1.0f,  1.0f, -1.0f, 0x000000FF },
   {  1.0f,  1.0f, -1.0f, 0x000000FF },
   {  1.0f, -1.0f, -1.0f, 0x000000FF },
   { -1.0f, -1.0f, -1.0f, 0x000000FF },

   {  1.0f, -1.0f,  1.0f, 0x0000FF00 }, 
   {  1.0f,  1.0f,  1.0f, 0x0000FF00 },
   { -1.0f,  1.0f,  1.0f, 0x0000FF00 },
   { -1.0f,  1.0f,  1.0f, 0x0000FF00 },
   { -1.0f, -1.0f,  1.0f, 0x0000FF00 },
   {  1.0f, -1.0f,  1.0f, 0x0000FF00 },


   { -1.0f,  1.0f, -1.0f, 0x00FF0000 },
   { -1.0f,  1.0f,  1.0f, 0x00FF0000 },
   {  1.0f,  1.0f,  1.0f, 0x00FF0000 },
   {  1.0f,  1.0f,  1.0f, 0x00FF0000 },
   {  1.0f,  1.0f, -1.0f, 0x00FF0000 },
   { -1.0f,  1.0f, -1.0f, 0x00FF0000 },

   {  1.0f, -1.0f, -1.0f, 0x00FFFF00 }, 
   {  1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   { -1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   { -1.0f, -1.0f,  1.0f, 0x00FFFF00 },
   { -1.0f, -1.0f, -1.0f, 0x00FFFF00 },
   {  1.0f, -1.0f, -1.0f, 0x00FFFF00 },

   { -1.0f, -1.0f,  1.0f, 0x00FF00FF }, 
   { -1.0f,  1.0f,  1.0f, 0x00FF00FF },
   { -1.0f,  1.0f, -1.0f, 0x00FF00FF },
   { -1.0f,  1.0f, -1.0f, 0x00FF00FF },
   { -1.0f, -1.0f, -1.0f, 0x00FF00FF },
   { -1.0f, -1.0f,  1.0f, 0x00FF00FF },

   {  1.0f, -1.0f, -1.0f, 0x0000FFFF }, 
   {  1.0f,  1.0f, -1.0f, 0x0000FFFF },
   {  1.0f,  1.0f,  1.0f, 0x0000FFFF },
   {  1.0f,  1.0f,  1.0f, 0x0000FFFF },
   {  1.0f, -1.0f,  1.0f, 0x0000FFFF },
   {  1.0f, -1.0f, -1.0f, 0x0000FFFF },

};

#define NUM_VERTICES (sizeof(g_vertices)/sizeof(my_vertex))

//顶点缓冲区是用优化方法渲染存储的顶点的一种方法
IDirect3DVertexBuffer8 *g_vb=NULL;


// 程序链接时加入d3d8.lib
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")

void D3DInit()
{
 HRESULT hr;
 unsigned char *vb_vertices;
 D3DXMATRIX view_matrix;
 D3DXMATRIX matProj;

    //由于要提供顶点颜色,所以要关闭D3D光源
    p_D3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

 // 开启z缓冲区。
    p_D3DDevice->SetRenderState( D3DRS_ZENABLE, TRUE );


 //顶点缓冲区是顶点的优化的存储方法。这里建立一个可足以容纳7个顶点
 //的顶点缓冲区。并允许Direct3D确定其在内存中的存放位置
    hr=p_D3DDevice->CreateVertexBuffer(NUM_VERTICES*sizeof(my_vertex),
                                       D3DUSAGE_WRITEONLY,
                                       D3D8T_CUSTOMVERTEX,
                                       D3DPOOL_MANAGED,
                                       &g_vb);

 //锁定Lock顶点缓冲区,使Direct3D知道要进行数据修改。完成数据拷贝后由解锁命令Unlock告诉Direct3D修改任务已完成
 hr=g_vb->Lock(0, //偏移量,从缓冲区起始位置开始
                 0, //锁定的尺寸,0代表锁定整个缓冲区
                 &vb_vertices, //如果成功,将指向顶点缓冲区中的数据
                 0);  //标志,未定义
   
 //vb_vertices指向了顶点缓冲区里的顶点,为了填充顶点缓冲区,
 //将数据拷贝到vb_vertices
 memcpy(vb_vertices, g_vertices, sizeof(g_vertices) );

 //解锁使Direct3D知道操作已完成
 g_vb->Unlock();


 //建立可视矩阵
 D3DXMatrixLookAtLH(&view_matrix,&D3DXVECTOR3( 0.0f, 0.0f,-8.0f ),
         &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
         &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ));

 //设定相机'camera'
 p_D3DDevice->SetTransform(D3DTS_VIEW,&view_matrix);


 D3DXMatrixPerspectiveFovLH(&matProj, //结果矩阵
                              D3DX_PI/4,//可视弧度范围
                              ((float)sw / (float)sh), //屏幕高宽比
                              1.0f,      //接近观测面
                              100.0f ); //远离观测面

   //透视矩阵不做改变
   p_D3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );

}

D3DFORMAT find_16bit_mode(void)
{
 HRESULT hr;

   //首先测试(16位色模式)R5G6B5
   hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_R5G6B5,D3DFMT_R5G6B5,FALSE);
   if(SUCCEEDED(hr)){
      OutputDebugString("D3DFMT_R5G6B5/n");
      return D3DFMT_R5G6B5;
   }

   //接下来测试X1R5G5B5
   hr=P_D3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X1R5G5B5,D3DFMT_X1R5G5B5,FALSE);
   if(SUCCEEDED(hr)){
      OutputDebugString("D3DFMT_X1R5G5B5/n");
      return D3DFMT_X1R5G5B5;
   }

   return (D3DFORMAT)NULL;
}

void D3DEnable()
{
 HRESULT hr;
 D3DPRESENT_PARAMETERS d3dpp;
 D3DDISPLAYMODE display_mode;

   //创建Drect3D8,这是在任何D3D8程序里必须做的事情
   //返回D3D版本值(D3D_SDK_VERSION)
   P_D3D = Direct3DCreate8( D3D_SDK_VERSION );
 
   //仅运行在窗口模式,功能是得到当前(桌面)显示模式
   hr=P_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&display_mode);
 

   //将D3DPRESENT_PARAMETERS结构清零
   ZeroMemory(&d3dpp,sizeof(d3dpp));

   //在全屏和窗口方式下均相同
   d3dpp.SwapEffect     = D3DSWAPEFFECT_DISCARD; //由于不再有用,所以要释放以前的帧。
   d3dpp.hDeviceWindow  = hWnd;  //这是主窗口(唯一的)
   d3dpp.BackBufferCount= 1;  //仅需要一个备分缓冲区
 d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;


   在全屏模式下要设置后备缓冲区的宽/高.
   if(fullscreen){
      d3dpp.Windowed          = FALSE;
      d3dpp.BackBufferWidth   = sw;
      d3dpp.BackBufferHeight  = sh;
      d3dpp.BackBufferFormat  = find_16bit_mode();
   }
   else
   {
      d3dpp.Windowed          = TRUE;
      d3dpp.BackBufferFormat  = display_mode.Format;
   }


   hr=P_D3D->CreateDevice(D3DADAPTER_DEFAULT, //在多显示器系统中默认的接口
                          //可以超过一个。尽可能地选择硬件加速而不是软件渲染
                          D3DDEVTYPE_HAL,
                          //当前的窗口
                          hWnd,
                          //用软件处理矢量,要比硬件方式慢,但兼容所有图形卡
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          // D3DPRESENT_PARAMETERS结构
                          &d3dpp,
                          //指向新的设备
                          &p_D3DDevice);
 
}

void D3DDisable()
{
   if(p_D3DDevice){
      p_D3DDevice->Release();
      p_D3DDevice=NULL;
   }

   if(P_D3D){
      P_D3D->Release();
      P_D3D=NULL;
   }
 if(g_vb){
      g_vb->Release();
      g_vb=NULL;
   }
}

void D3DSceneShow()
{
D3DXMATRIX matWorld;
D3DXMATRIX rot_matrix;   
D3DXMATRIX trans_matrix; 
static float rot_triangle=0;
static float rot_square=0;  

   rot_triangle+=0.004f;
   rot_square+=0.007f;

   //清除缓冲区并置为新的颜色
 p_D3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER , D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

   //向设备提示开始进行渲染
   if(SUCCEEDED(p_D3DDevice->BeginScene())){

      //使用普通的顶点格式
      p_D3DDevice->SetVertexShader(D3D8T_CUSTOMVERTEX);

      //告诉D3D为三角形建立的顶点缓冲区是渲染功能要读取的数据流
      p_D3DDevice->SetStreamSource(0,g_vb,sizeof(my_vertex));

      //为三角形设置旋转矩阵。
      D3DXMatrixRotationY(&rot_matrix,rot_triangle);
      //向左移动1.5个单元,向屏幕内移动1个单元
      D3DXMatrixTranslation(&trans_matrix,-1.5,0.0f,1.0f);
      //合并2矩阵得到最终的世界矩阵
      D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
      //设置世界矩阵
      p_D3DDevice->SetTransform(D3DTS_WORLD,&matWorld );


      //绘制三角形
      p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,4);

      //为正方形设置旋转矩阵。
       D3DXMatrixRotationX(&rot_matrix,rot_square);
       //为正方形设置世界矩阵。

       D3DXMatrixTranslation(&trans_matrix,1.5,0.0f,1.0f);
       //合并2矩阵得到最终的世界矩阵
  D3DXMatrixMultiply(&matWorld,&rot_matrix,&trans_matrix);
       p_D3DDevice->SetTransform( D3DTS_WORLD, &matWorld );
       //跳过开始6个顶点(属于金字塔的),绘制剩下的12个三角形。
       p_D3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,6,12);

 

      //向设备提示渲染完成
      p_D3DDevice->EndScene();
   }

   //显示结果
   p_D3DDevice->Present( NULL, NULL, NULL, NULL );


}

LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
        WPARAM wParam, LPARAM lParam )
{

 switch ( message )
 {
  case WM_CREATE:
   GetWindowRect(hWnd, &rect);
   sw = rect.right - rect.left;
   sh = rect.bottom - rect.top;
//   SceneResizeViewport(sw, sh);
   return 0;

  case WM_SIZE:
   return 0;

  case WM_CLOSE:
   ShowWindow (hWnd, SW_HIDE);
   PostQuitMessage( 0 );
   return 0;

  case WM_DESTROY:
   return 0;

  case WM_KEYDOWN:
   switch( wParam )
   {
   case VK_ESCAPE:
    PostMessage(hWnd, WM_CLOSE, 0, 0);
   break;
   }
   return 0;
  default:
  return DefWindowProc( hWnd,message, wParam, lParam );
 }
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  WNDCLASS wc;
 MSG msg;
 bool bQuit = false;

 

 if (MessageBox(NULL,"是否选择全屏显示模式?", "全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
 {
  fullscreen=0;       //窗口模式
 }

 wc.style = CS_OWNDC;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
 wc.hCursor = LoadCursor( NULL, IDC_ARROW );
 wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
 wc.lpszMenuName = NULL;
 wc.lpszClassName = "Name";
 RegisterClass( &wc );


 if(fullscreen)
 {

  hWnd = CreateWindow(
        "Name",
        "Lesson1",
        WS_POPUP |  WS_CLIPSIBLINGS | WS_VISIBLE,
        0, 0,
        GetSystemMetrics( SM_CXSCREEN ),
        GetSystemMetrics( SM_CYSCREEN ),
        NULL, NULL,
        hInstance,
        NULL );
 }else
 {
  hWnd = CreateWindow(
       "Name",
       "Lesson1",
       WS_TILEDWINDOW | WS_VISIBLE,
       GetSystemMetrics( SM_CXSCREEN )/2-sw/2,
       GetSystemMetrics( SM_CYSCREEN )/2-sh/2,
       sw,
       sh,
       NULL, NULL,
       hInstance,
       NULL );
  ChangeDisplaySettings(NULL, 0);
 }
 ShowWindow(hWnd, SW_SHOW);
 UpdateWindow(hWnd);

 //初始化
 D3DEnable();
 D3DInit();

 if(!fullscreen)
 {
  GetWindowRect(hWnd, &rect);
  sw = rect.right - rect.left;
  sh = rect.bottom - rect.top;

 }


 while ( !bQuit )
 {
  if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
   if ( msg.message == WM_QUIT )
    bQuit = true;
   else
   {
    TranslateMessage( &msg );
    DispatchMessage( &msg );
   }
  else
  {

   D3DSceneShow();
  }
 }

 //关闭,退出程序
 D3DDisable();

 ShowWindow (hWnd, SW_HIDE);
 DestroyWindow( hWnd );

 ChangeDisplaySettings(NULL, 0);

 return msg.wParam;

 return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值