برنامه نویسی Direct3D در ویژوال بیسیک (قسمت سوم)
شروع کار برای رسم اشیا دوبعدی
ابتدا ثابت FVF را تعریف می کنیم. این ثابت توصیف "فرمت قابل انعطاف نقطه flexible-vertex-format" برای یک Vertex دو بعدی انتقال یافته و ساده شده می باشد. سپس بایستی یک ساختار برای توصیف این Vertex معرفی کنیم:
کد:
کد:
 Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
کد:
کد:
 Private Type TLVERTEX
   X As Single
   Y As Single
   Z As Single
   rhw As Single
   color As Long
   specular As Long
   tu As Single
   tv As Single
End Type
فرض کنید بخواهیم یک مربع را در صفحه رسم کنیم. برای رسم آن نیاز به 4 عدد Vertex داریم. بنابراین آرایه TriStrip را از نوع TLVERTEX تعریف میکنیم:
کد:
کد:
 Dim TriStrip (0 To 3) As TLVERTEX
حال به سراغ تابع Initialise که در درس 1 با آن آشنا شدید می رویم و دستورات زیر را به آن اضافه می کنیم:

ابتدا سیستم سایه زنی Vertex را طوری تنظیم می کنیم که از FVF استفاده کند:
کد:
D3DDevice.SetVertexShader FVF
حال سیستم Lighting را برای Vertex های دو بعدی غیر فعال می کنیم زیرا نیازی به آن نداریم:
کد:
کد:
 D3DDevice.SetRenderState D3DRS_LIGHTING, False
حال بایستی تابع InitializeGeometry را اجرا کنیم. این تابع را در ادامه توضیح خواهم داد. اگر نتیجه این تابع True باشد دراینصورت Initialise به درستی انجام شده است:
کد:
کد:
 If InitialiseGeometry() = True Then
   Initialise = True
   Exit Function
End If
تابع InitialiseGeometry در این درس، تابعی ساده است که تنها آرایه Vertex ها را مقدار دهی می کند. برای رسم یک مربع نیاز به مقداردهی ۴ Vertex در جهت عقربه های ساعت داریم. ( این مربع شامل ۲ مثلث است)


کد:
کد:
 Private Function InitialiseGeometry() As Boolean

   On Error GoTo BailOut:

   TriStrip(0) = CreateTLVertex(100, 100, 0, 1, RGB(255, 255, 255), 0, 0, 0)
   TriStrip(1) = CreateTLVertex(300, 100, 0, 1, RGB(255, 0, 0), 0, 0, 0)
   TriStrip(2) = CreateTLVertex(100, 300, 0, 1, RGB(0, 255, 0), 0, 0, 0)
   TriStrip(3) = CreateTLVertex(300, 300, 0, 1, RGB(0, 0, 255), 0, 0, 0)

   InitialiseGeometry = True
   Exit Function

   BailOut:
   InitialiseGeometry = False
End Function
همانطور که مشاهده می کنید برای تعریف Vertex از تابع CreateTLVertex استفاده شده است. این تابع صرفاً مقادیر ساختار TLVERTEX را مقداردهی می کند:
کد:
کد:
 Private Function CreateTLVertex(X As Single, Y As Single, Z As Single, rhw As Single,
color As Long, specular As Long, tu As Single, tv As Single) As TLVERTEX
   CreateTLVertex.X = X
   CreateTLVertex.Y = Y
   CreateTLVertex.Z = Z
   CreateTLVertex.rhw = rhw
   CreateTLVertex.color = color
   CreateTLVertex.specular = specular
   CreateTLVertex.tu = tu
   CreateTLVertex.tv = tv
End Function
نکته: شما می توانید مقادیر اعشاری Floating Point را برای مختصاتهای x و y و z بکار ببرید، اما Direct3D مختصاتها را با گردکردن آنها تخمین می زند و بنابراین ممکن است باعث ایجاد نتایج ناخواسته شود.

حال بایستی تابع Render را بنویسیم:
کد:
کد:
 Public Sub Render()

   D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0

   D3DDevice.BeginScene
   D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, TriStrip(0), Len(TriStrip(0))
   D3DDevice.EndScene

   D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

End Sub
ساختار اصلی برای اجرای توابع فوق بصورت زیر است:
کد:
کد:
 Initialize

Do While YourEvent = True
   Render
   DoEvents
Loop