PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی Direct3D در ویژوال بیسیک (قسمت سوم)



TAHA
10-30-2009, 12:12 AM
برنامه نویسی 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 در جهت عقربه های ساعت داریم. ( این مربع شامل ۲ مثلث است)

http://pnu-club.com/imported/mising.jpg

کد:

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