موضوع : رسم اشکال دو بعدي مروري بر 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
|