موضوع : رسم اشکال دو بعدی
مروری بر object های DirectX8
1 DirectX8 : این شی ، شی مرکزی برای directX است و به شما امکان دسترسی به توابع و اشیا DirectX را می دهد .
? - Direct3D8 : شی اصلی برای کار با محیط سه بعدی می باشد . هدف از آن ، ساخت Direct3DDevice8 است و همچنین شامل توابعی برای مشخص کردن توانایی های کارت گرافیک است .
? - Direct3DDevice8 : این شی مسئول ساخت بافتها textures ، مدیریت نورها در یک صحنه ، مدیریت مواد materials و همچنین render صحنه است . در واقع این شی ، قلب نمایشی کار شماست .
4 - 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
فرض کنید بخواهیم یک مربع را در صفحه رسم کنیم . برای رسم آن نیاز به 4 عدد 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 |