( تعداد نمایش : 1771 )

آموزش DirectX-Graphic در ویژوال بیسیک قسمت سوم

موضوع : رسم اشکال دو بعدی

مروری بر object های DirectX8
1 – DirectX8 : این شی ، شی مرکزی برای directX است و به شما امکان دسترسی به توابع و اشیا DirectX را می دهد .
۲ – Direct3D8 : شی اصلی برای کار با محیط سه بعدی می باشد . هدف از آن ، ساخت Direct3DDevice8 است و همچنین شامل توابعی برای مشخص کردن توانایی های کارت گرافیک است .
۳ – Direct3DDevice8 : این شی مسئول ساخت بافتها textures ، مدیریت نورها در یک صحنه ، مدیریت مواد materials و همچنین render صحنه است . در واقع این شی ، قلب نمایشی کار شماست .
۴ – D3DX8 : گر چه همیشه نیازی به استفاده از این شی نیست ، اما این شی شامل توابعی برای ساخت برنامه های userfriendly تر توسط DirectX است . مثلاً ساخت اشیا سه بعدی ( مثل کره ، مکعب و … ) ، ساخت بافتها ، ساخت سطوح و غیره
شروع کار برای رسم اشیا دوبعدی
ابتدا ثابت 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


فرض کنید بخواهیم یک مربع را در صفحه رسم کنیم . برای رسم آن نیاز به ۴ عدد vertex داریم . بنابراین آرایه TriStrip را از نوع TLVERTEX تعریف میکنیم :


Dim TriStrip (0 To 3) As TLVERTEX


حال به سراغ تابع initialize که در درس ۱ با آن آشنا شدید می رویم و دستورات زیر را به آن اضافه می کنیم :


Private Function Initialize as boolean
.
.
.


ابتدا سیستم سایه زنی vertex را طوری تنظیم می کنیم که از FVF استفاده کند .


D3DDevice.SetVertexShader FVF


حال سیستم lighting را برای vertex های دو بعدی غیر فعال می کنیم زیرا نیازی به آن نداریم :


D3DDevice.SetRenderState D3DRS_LIGHTING,false


حال بایستی تابع initializeGeometry را اجرا کنیم . این تابع را در ادامه توضیح خواهم داد . اگر نتیجه این تابع true باشد دراینصورت initialize به درستی انجام شده است :


if initializeGeometry()=true then initialize=true
end function


تابع initializeGeometry در این درس ، تابعی ساده است که تنها آرایه Vertex ها را مقدار دهی می کند . برای رسم یک مربع نیاز به مقداردهی ۴ vertex در جهت عقربه های ساعت داریم ( این مربع شامل ۲ مثلث است )


Private Function InitialiseGeometry() As Boolean
On Error GoTo BOut:
color = RGB(200, 100, 0)
TriStrip(0) = CreateTLVertex(100, 100, 0, 1, color, 0, 0, 0)
TriStrip(1) = CreateTLVertex(300, 100, 0, 1, color, 0, 0, 0)
TriStrip(2) = CreateTLVertex(100, 300, 0, 1, color, 0, 0, 0)
TriStrip(3) = CreateTLVertex(300, 300, 0, 1, color, 0, 0, 0)
InitialiseGeometry = True
Exit Function
BOut:
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


نکته : ضمن اینکه شما می توانید مقادیر اعشاری floating point را برای مختصاتهای x و y و z بکار ببرید ، Direct3D مختصاتها را با گردکردن آنها تخمین می زند و بنابراین ممکنست باعث ایجاد نتایج ناخواسته شود .


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
حال بایستی تابع 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))x
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub


ساختار اصلی برای اجرای توابع فوق بصورت زیر است :


–Main part–
Initialize
Do While yourevent=true
Render
DoEvents
Loop

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن