)Managed DirectX +C# 開發(入門篇)(五)

來源:互聯網
上載者:User
如果代碼是:device.DrawPrimitives(PrimitiveType.LineStrip, 0,3);執行結果是:它把頂點繪製為一條折線。至少需要兩個頂點。如果代碼為:device.DrawPrimitives(PrimitiveType.PointList, 0,4);執行結果是:把資料作為一系列離散的點來繪製。  四、建立頂點緩衝使用頂點緩衝可以大幅度提高工作效率,如果不使用頂點緩衝,當每次渲染情境裡,都要分配新的頂點列表,並且所有的內容都要儲存在系統記憶體裡,如果使用頂點緩衝,則可以把頂點資料存放在顯存中,這樣會大幅度提高應用程式的效能;在D3D中使用VertexBuffer()類來建立一個頂點緩衝,以下為其中一個建構函式:public VertexBuffer( Type typeVertexType, int numVerts, Device device, Usage usage,VertexFormats vertexFormat, Pool pool);其中各參數的含義如下:device——建立頂點緩衝的device,建立的頂點緩衝只能被這個device使用;
sizeOfBufferInBytes——建立的頂點緩衝大小,大小以位元組為單位。使用帶有這個參數的建構函式建立的頂點緩衝可以存放任何類型的頂點;
typeVertexType——如果要去建立的頂點緩衝只儲存一種類型的頂點,則使用這個參數。它的值可以是CustomVertex類中的頂點結構類型,也可以是自訂的頂點類型。這個值不能為null;
numVert——指定緩衝儲存的頂點數量最大值。usage——如何使用頂點緩衝。使用以下選項:DoNotClip,Dynamic, Npatches, Points, PTPatches, SoftwareProcessing, WriteOnly;
vertexFormat——在頂點緩衝中的頂點格式,如果建立的為一般緩衝的話,則使用VertexFormat.None;
pool——頂點緩衝使用的記憶體池位置,可以指定以下幾個記憶體池位置:
  Default, Managed, SystemMemory, Scratch。 以下程式碼範例為使用數組來讀和寫一個頂點緩衝區:public struct PositionNormalTexVertex{       public Vector3 Position;       public Vector3 Normal;       public float Tu0, Tv0;       public static readonly VertexFormats FVF = VertexFormats.Position | VertexFormats.Texture1;} public class Example{       public void ArrayBasedReadWrite()       {              //建立一個頂點緩衝區              VertexBuffer vb = new VertexBuffer(typeof(PositionNormalTexVertex), 100, device, Usage.None, PositionNormalTex1Vertex.FVF, Pool.Managed);//填充資料              PositionNormalTexVertex[] vbData = (PositionNormalTexVertex[]) vb.Lock(0, typeof(PositionNormalTexVertex), LockFlags.None, 50);              for(int i=0; i<50; i++)              {                     //set your vertices to something...                     vbData[i].Position = new Vector3(2f,2f,2f);                      vbData[i].Normal = new Vector3(1f,0f,0f);                     vbData[i].Tu0 = i;                     vbData[i].Tv0 = i;              }                     vb.Unlock();              vbData = (PositionNormalTexVertex[]) vb.Lock(0, LockFlags.ReadOnly);              for(int i=0; i<100; i++)              {                     //讀取頂點資料                     Console.WriteLine("Vertex " + i + "Tu: " + vbData[i].Tu0 + " , Tv: " + vbData[i].Tv0);              }              vb.Unlock();              vb.Dispose();       }}在本樣本程式中,建立頂點緩衝是放在一個事件中,也就是說當建立程式時建立頂點緩衝,以後則不必再建立了。程式執行結果如下: 五、座標變換現在產生的三角形,使用了一個叫做transformed座標系統,這種座標是顯示器的螢幕所使用的座標。但是不靈活,另一種是未經過變換的座標系統。下面就來介紹這種座標系統。與螢幕座標不同的是,可以把我們的空間想象成為一個無限大的三維笛卡爾直角座標系,可以把繪圖對象,比如人物、車等,放到任意位置,如果到時候想在螢幕上顯示此人,可以把攝像機“對”著他就可以了,這和現實世界中的拍電影很類似。為了介紹這個內容,首先把前面使用的頂點格式類型變過來,具體代碼,可以看SDK樣本三VertexBuffer vb = (VertexBuffer)sender;              CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vb.Lock(0,0);              verts[0].X=-1.0f; verts[0].Y=-1.0f; verts[0].Z=0.0f; verts[0].Color = System.Drawing.Color.DarkGoldenrod.ToArgb();              verts[1].X=1.0f; verts[1].Y=-1.0f ;verts[1].Z=0.0f; verts[1].Color = System.Drawing.Color.MediumOrchid.ToArgb();              verts[2].X=0.0f; verts[2].Y=1.0f; verts[2].Z = 0.0f; verts[2].Color = System.Drawing.Color.Cornsilk.ToArgb();              vb.Unlock();下面所要做的,需要給情境添加一個攝像機;然後讓攝像機“照”著我們所建立的對象,當然,情境中還需要有燈光,不然,黑洞洞的,什麼也沒有;後面再介紹;在device上通過兩個不同的變換來控制攝像機。每一種變換都被定義為一個4×4的矩陣傳遞給DirectX3D,使用它,等於告訴攝像機情境如何投影到顯示器。通常的做法是使用Matrix類的PerspectiveFovLH方法。它使用左手座標系建立一個正對情境的透視投影變換。
現在看看這個函數的建構函式:public static Matrix PerspectiveFovLH( float fieldOfViewY,float aspectRatio,float znearPlane,float zfarPlane);此矩陣實際上是設計了一個梯形體,凡是在這裡面的對象,都是可見的,在這個範圍外面的,都將是不可見的。這個範圍由由可視角度和前裁剪面(Near Plane)與後裁剪面(Far Plane)所決定,函數頭裡的nearPlane和farPlane兩個參數,描繪了範圍的邊界:farPlane就是梯形體底面,而nearPlane則是橫截面。fieldOfView參數描繪了梯形體的角度。aspectRatio類似於電視的高寬比,比如,寬銀幕電視的高寬比是1.85。可以用可視地區的寬度來比上高度得出這個值。下面還需要有一個函數來包含攝像機的資訊,在D3D中這個函數就是LookAtLH(),先看它的建構函式:  public static Matrix LookAtLH(Matrix pOut, Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector);建構函式中的參數的含義是:攝像機的位置、攝像機觀察點的位置以及一個被參考為“up”的方向。有了這兩個函數的幫忙,就可以在全局座標系中顯示3D 物件了。在樣本三的程式中的代碼是:device.Transform.View = Matrix.LookAtLH( new Vector3( 0.0f, 3.0f,-5.0f ), new Vector3( 0.0f, 0.0f, 0.0f ), new Vector3( 0.0f, 1.0f, 0.0f ) );              device.Transform.Projection = Matrix.PerspectiveFovLH( (float)Math.PI / 4, 1.0f, 1.0f, 100.0f ); 另外,在程式中,為了更好的表現,加入了以下代碼:     int iTime = Environment.TickCount % 1000;              float fAngle = iTime * (2.0f * (float)Math.PI) / 1000.0f;              device.Transform.World = Matrix.RotationY( fAngle );此代碼的作用是,讓情境繞Y軸旋轉,而旋轉的角度值則為一個變化的值,這樣就得到了一個旋轉的三角形;程式執行結果如下:轉自:dandancool http://blog.csdn.net/dandancool/archive/2007/06/26/1666561.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.