PDA

View Full Version : آموزش: آموزش DirectX-Graphic



juggle
یک شنبه 31 مرداد 1389, 18:06 عصر
برگرفته از کتاب Visual Basic
مؤلف: وحید شیداییان

آموزش DirectX-Graphic قسمت اول


DirectX8 ابزاري براي ساخت تصاوير ثابت و متحرک دو بعدي و سه بعدي مي باشد .
براي کار با DirectX8 ابتدا بايستي آنرا روي سيستم خود نصب کنيد . سپس در محيط vb از منوي project گزينه References را انتخاب کنيد . در فرمي که ظاهر مي شود اطمينان حاصل کنيد که گزينه DirectX8 for VB type library فعال باشد .
براي کار با DirectX8 بايستي از تعريف نمودن شي پايه DirectX8 شروع نمود :




Dim Dx as DirectX8

شي Direct3D8 براي کنترل اشيا‌‌ سه بعدي بکار مي رود :





Dim D3D as Direct3D8


شي Direct3DDevice8 ، سخت افزار مربوط به رندر تصاوير را مشخص مي کند :





Dim D3DDevice as Direct3DDevice8


حال براي شروع کار با Direct3D ، تابع ( ) initialise را تعريف مي کنيم . اگر اينکار درست انجام شود تابع ، مقدار true را برمي گرداند :





public function initialise () as boolean



DimDispMode as D3DISPLAYMODE


شي D3DISPLAYMODE حالت نمايش را مشخص مي نمايد .





Dim D3Dwindow as D3DPRESENT_PARAMETERS


شي فوق مشخص مي کند که viewport شما چگونه باشد .
حال شي اصلي DirectX8 را مي سازيم :





Set Dx=New DirectX8


سپس شي اصلي ساخت واسط سه بعدي را مي سازيم :





()set D3D.Dx.Direct3Dcreate


سپس حالت فعلي نمايش را با دستور زير استخراج مي کنيم :





D3D.getadapterdisplaymodeD3DADAPTER_DEFAULT,dispmo de


حال دو حالت براي کار با DirectX داريم :
1 - windowed mode
2 - fullscrean mode
1 - براي کار با حالت پنجره اي ابتدا اين موضوع را به DirectX اطلاع مي دهيم :





D3Dwindow.windowed=1


سپس نوع referesh تصوير را مشخص مي کنيم ( در اينجا چند انتخاب وجود دارد که در صورت نياز به اطلاعات بيشتر با من (sheidaian@yahoo.com) تماس بگيريد . ) :





D3Dwindow.swapeffect=D3DSWAPEFFECT_COPY_VSYNC


سپس بايستي فرمت بافر نگهدارنده تصاوير را مشخص کنيم :





D3Dwindow.backbufferformat=dispmode.format


2 - براي کار با حالت تمام صفحه ، ابتدا نوع refresh را مشخص کرده سپس تعداد بافر هاي تصوير و سرانجام نوع و سايز بافر را مشخص مي نمائيم :





D3Dwindow.swapeffect=D3DSWAPEFFECT_DISCARD



D3Dwindow.backbuffercount=1



D3Dwindow.backbufferformat=dispmode.format



D3Dwindow.backbufferheight=dispmode.height



D3Dwindow.backbufferwidth=dispmode.width


سپس پنجره نمايش مشخص مي گردد :





D3Dwindow.hdevicewindow=frmMain.hwnd



@حال بايستی يک device ساخته شود که يا از طريق سخت افزار و يا نرم افزار تصاوير را رندر نمايد :





SetD3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT



,D3DDEVTYPE_HAL,



frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,



D3Dwindow)x,



endsub


درصورتي که کارت گرافيک شما امکانات رندر سخت افزاري تصاوير را ندارد از D3DDEVTYPE_REF بجاي D3DDEVTYPE_HAL استفاده کنيد .
حال بايستي روتين render را بنويسيم . البته در اين درس تصويري براي رندر نداريم و تنها چگونگي نوشتن اين روتين را بيان خواهم کرد :
۱ - ابتدا بايستي device مربوط به رندر ، قبل از کشيدن تصوير در آن پاک شود :





D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,&H0,1#,0


عدد hex اي که در دستور فوق آمده رنگ زمينه صفحه را مشخص مي کند
۲ - سپس بايستي تصاوير مورد نظر را رندر کنيم . اينکار توسط دستورات زير انجام مي شود :





D3DDevice.beginscence



all rendering calls gobetween these two lines '



D3DDEvice.endscence


3 - در پايان بايستي صفحه را update کنيد :





D3DDevice.present byval 0,byval 0,0,byval 0
--------------------
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

juggle
دوشنبه 01 شهریور 1389, 15:48 عصر
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

M.T.P
دوشنبه 01 شهریور 1389, 16:27 عصر
لطفا ادامه بدید... :تشویق:

juggle
دوشنبه 01 شهریور 1389, 16:49 عصر
آموزش DirectX-Graphic قسمت دوم

موضوع : بدست آوردن مشخصات و تواناييهاي گرافيکي يک سيستم توسط DirectX-Graphic



1 - شمارش تعداد آداپتورهاي گرافيکي يک سيستم : فرض کنيد متغير nAdapters متغيري از نوع long باشد . همچنين شي D3DADAPTER_IDENTIFIER8 يک ساختار است که اطلاعات مربوط به آداپتور را نگه مي دارد . در اينصورت روتين enumerateAdapters بصورت زير خواهد بود :



Dim adapterinfo as D3DADAPTER_IDENTIFIER8
Private Sub EnumerateAdapters
Dim i as integer
nadapters=D3D.Getadaptercount


براي بدست آوردن جزئيات آداپبورها بصورت زير عمل مي کنيم :



for i=0 to nadapters-1
D3D.GetadapterIdentifier i ,0,adapterinfo


نام اين آداپتور بصورت ليستي از کدهاي اسکي است که بايستي آنها را درون يک string قرار دهيم :



for j=0 to 511
name=name & chr$(adapterinfo.description(j)) x
next j
name=replace(name,chr$(0)," ") x
end sub


بنابراين در متغير name نام آداپتور قرار خواهد گرفت .

۲ - مشخص کردن نوع Rendering : فرض کنيد شي D3DCAPS8 توانايي rendering آداپتور را نشان دهد . در اينصورت روتين EnumerateDevices بصورت زير خواهد بود :



Private EnumerateDevices
On Local Error resume next
Dim Caps as D3DCAPS8
deviceindex=0 'For Example
D3D.Getdevicecaps deviceindex,D3DDEVTYPE_HAL,caps
if err.number=D3DERR_NOTAVAILABLE then


اگر آداپتور امکان رندر سخت افزاري نداشته باشد در اينصورت :



MsgBox("Reference Rasterizer(REF)") x
else
MsgBox("Hardware Acceleration(HAL)+Reference Rasterizer(REF)") x
end if
end sub


3 - شمارش تعداد Mode نمايشي آداپتور :
فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1
باشد . همچنين شي D3DDISPLAYMODE اطلاعات مدهاي نمايشي را در خود
دارد . همچنين فرض کنيد متغير nModes از نوع longباشد . در اينصورت روتين enumeratedispmodes بصورت زير خواهد بود :



Private Sub EnumerateDispModes(r as Long,n as Long) x
Dim i as integer
Dim mode_tmp as D3DDISPLAYMODE
deviceindex=0 'For Example
nModes=D3D.Getadaptermodecount(deviceindex) x
for i=0 to nModes-1
D3D.EnumAdapterModes(deviceindex,i,mode_tmp) x


ابتدا Mode ها را به دو گروه ۱۶ بيتي و ۳۲ بيتي تقسيم مي کنيم :



if mode_tmp.format=D3DFMT_R8G8B8 or mode_tmp=D3DFMT_X8R8G8B8 or mode_tmp=D3DFMT_A8R8G8B8 then


حال چک مي کنيم که device قابل پذيرش و معتبر است يا نه :



if D3D.checkdevicetype(deviceindex,r,mode_tmp.format, mode_tmp.format,Flase)>=0 then
MsgBox(mode_tmp.width & "X" & mode_tmp.height & "32 Bit
FMT:" & mode_tmp.format ) x & "
end if
else
if D3D.checkdevicetype(deviceindex,r,mode_tmp.format, mode_tmp.format,Flase)>=0 then
MsgBox(mode_tmp.width & "X" & mode_tmp.height & "16 Bit
FMT:" & mode_tmp.format ) x & "
end if
end if
next i


4 - مشخص کردن توانايي هاي آداپتور گرافيکي : فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1 باشد :




Private Sub EnumerateHardware(r as long) x



Dim caps as D3DCAPS8



D3D.Getdevicecaps deviceindex,r,caps



If Caps.MaxActiveLights = -1 Then



MsgBox "Maximum Active Lights: Unlimited" x



Else



MsgBox "Maximum Active Lights: " & Caps.MaxActiveLights



End If



MsgBox "Maximum Point Vertex size: " & Caps.MaxPointSize



MsgBox "Maximum Texture Size: " & Caps.MaxTextureWidth & "X" & Caps.MaxTextureHeight



MsgBox "Maximum Primatives in one call: " & Caps.MaxPrimitiveCount



If Caps.TextureCaps And D3DPTEXTURECAPS_SQUAREONLY Then



MsgBox "Textures must always be square" x



End If



If Caps.TextureCaps And D3DPTEXTURECAPS_CUBEMAP Then



MsgBox "Device Supports Cube Mapping" x



End If



If Caps.TextureCaps And D3DPTEXTURECAPS_VOLUMEMAP Then



MsgBox "Device Supports Volume Mapping" x



End If



If Caps.DevCaps And D3DDEVCAPS_PUREDEVICE Then



MsgBox "Device supports the Pure Device Option" x



End If



If Caps.DevCaps And D3DDEVCAPS_HWTRANSFORMANDLIGHT Then



MsgBox "Device supports hardware transform and lighting" x



End If



If Caps.DevCaps And D3DDEVCAPS_HWRASTERIZATION Then



MsgBox "Device can use Hardware Rasterization" x



End If



If Caps.Caps2 And D3DCAPS2_CANCALIBRATEGAMMA Then



MsgBox "Device can Calibrate Gamma" x



End If



If Caps.Caps2 And D3DCAPS2_CANRENDERWINDOWED Then



MsgBox "Device can Render in Windowed Mode" x



End If



If Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA Then



MsgBox "Device can calibrate gamma in fullscreen mode" x



End If



If Caps.RasterCaps And D3DPRASTERCAPS_FOGRANGE Then



MsgBox "Device supports range based fog calculations" x



End If



If Caps.RasterCaps And D3DPRASTERCAPS_ANISOTROPY Then



MsgBox "Device supports Anisotropic Filtering" x



End If



If Caps.RasterCaps And D3DPRASTERCAPS_ZBUFFERLESSHSR Then



MsgBox "Device does not require a Z-Buffer/Depth Buffer" x



End If




---------------------------------------------------------------------------------------------------



در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

returnx
سه شنبه 02 شهریور 1389, 17:26 عصر
لطفا کد ها رو در تگ(Tag)کد قرار بدید تا خوانا باشه.:چشمک:

juggle
چهارشنبه 03 شهریور 1389, 02:51 صبح
آموزش DirectX-Graphic قسمت سوم


<DIV class=txt>موضوع : رسم اشکال دو بعدي

مروري بر 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

juggle
شنبه 06 شهریور 1389, 00:21 صبح
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

juggle
یک شنبه 07 شهریور 1389, 00:48 صبح
آموزشDirectX-Graphic قسمت چهارم


موضوع : آشنايي با برخي اصطلاحات

1- Mesh : مش ، مجموعه اي از face ها است که يک شي سه بعدي را روي صفحه تشکيل مي دهند .

۲ - Face : يک چند ضلعی است که توسط مجموعه ای از نقاط به نام vertex ساخته مي شود .

۳ - Vertex : يک نقطه در فضاي سه بعدي است که براي دادن موقعيت ، scale و زاويه يک face استفاده مي شود .

۴ - Direct3D از شيي بنام D3DVERTEX براي نمايش يک Vertex استفاده مي کند . براي ساخت face نيز از آرايه اي از vertex ها استفاده مي شود . آرايه هميشه بايستي قابل تقسيم به سه باشد زيرا اشکال از face هاي مثلثي ساخته مي شوند . هنگاميکه اين مثلثها کنار هم گذاشته شوند ، شي سه بعدي را مي سازند . Direct3D از بافري با نام Index Buffer استفاده مي کند که با direct3D مي گويد که با چه ترتيبي vertex ها را رسم نمايد . index ها بايستي هميشه در جهت عقربه هاي ساعت مشخص شوند .

behzad_lover
یک شنبه 07 شهریور 1389, 01:21 صبح
کارتون عالیه. ادامه بدید...

FULLSYSTEM
یک شنبه 07 شهریور 1389, 14:00 عصر
مطالب خیلی جالب و کاربردیه:تشویق:

لطفا ادامه بدین:لبخندساده:

juggle
یک شنبه 07 شهریور 1389, 14:53 عصر
آموزشDirectX-Graphic قسمت پنجم


موضوع : اختصاص بافت Texture به اشکال دو بعدي

در اين درس مي خواهيم يک مربع که داراي بافت مي باشد را رسم کنيم . براي اينکار از کتابخانه کمکي D3DX8 استفاده مي کنيم . همچنين شي Direct3DTexture8 را نيز استفاده مي نمائيم .




Dim D3DX as D3DX8
Dim Texture as Direct3DTexture8



حال بايستي در تابع Initialize بافت مربوطه را از روي يک فايل تصويري load کنيم :



Private Function Initialize as boolean
.
.
.
Set Texture=D3DX8.CreateTextureFromFile(D3DDevice,app. path & yourfilename) x
end function


تابع Render نيز بصورت زير خواهد بود :



Private Sub Render
D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,0,1#,0
D3DDevice.beginscence
D3DDevice.SetTexture 0,Texture
D3DDevice.DrawprimitiveUP D3DPT_TRIANGLESTRIP,2,Tripstrip(0),len(Tristrip(0) )x
.
.
.
end function

juggle
دوشنبه 08 شهریور 1389, 13:33 عصر
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

MMR_1344
دوشنبه 08 شهریور 1389, 21:03 عصر
دوست عزیز
از زحمتی که میکشید و این بخش رو ایجاد کرده اید متشکرم اگر ادامه بدهید ممنون خواهیم بود

juggle
چهارشنبه 10 شهریور 1389, 12:24 عصر
آموزشDirectX-Graphic قسمت ششم

موضوع : مفاهيم اوليه رسم اشکال سه بعدي در DirectX 8

در اين درس با استفاده از Direct3D يک مکعب را رسم مي کنيم . براي اين منظور ابتدا نياز به يک بافر داريم که بتوانيم شکل مورد نظر خود را در آن ذخيره کنيم :




Dim VBuffer as Direct3DVertexBuffer8


براي رسم مکعب از vertex هاي سه بعدي استفاده مي کنيم . براي اينکار نياز به تعريف يک تايپ جديد داريم :



Private Type LITVERTEX
x as single
y as single
z as single
color as long
specular as long
tu as single
tv as single
end type


توصيف گر اين فرمت ، بصورت زير است :



Const Lit_FVF = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR Or D3DFVF_TEX1)x


براي توصيف مکعب در اين درس از روشي غيرکارامد استفاده شده است . به اين ترتيب که از ۳۶ عدد vertex استفاده شده ( در درسهاي بعدي متدهايي معرفي خواهند شد که اجازه مي دهند از ۸ عدد vertex باري توصيف مکعب استفاده کنيد ) .



Dim cube(35) as LITVERTEX


سپس بايد يکسري ماتريس سه بعدي تعريف کنيم :
اولين ماتريس ، matworld است که نشان مي دهد چگونه vertex ها در فضاي سه بعدي قرار گرفته اند . دومين ماتريس ، matview است که نشان مي دهد دوربين ( نقطه ديد ) در کجا قرار گرفته و سومين ماتريس ، matproj است که نشان مي دهد دوربين چگونه دنياي سه بعدي را روي صفحه دو بعدي نشان مي دهد :



Dim matworld as D3DMATRIX
Dim matview as D3DMATRIX
Dim matproj as D3DMATRIX


در تابع Initialize قبل از ساخت device بايستي چک کنيم که آيا مي توانيم از يک بافر Z شانزده بيتي استفاده کنيم يا نه ؟



If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DispMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
D3DWindow.AutoDepthStencilFormat = D3DFMT_D16 '16 bit Z-Buffer


حال بايستي متد D3DCreateDevice را اجرا کنيد . سپس بايد سيستم سايه زني vertex را با فرمت vertex مان تنظيم کنيم :



D3DDevice.SetVertexShader Lit_FVF


همچنين سيستم نورپردازي را غير فعال مي کنيم :



D3DDevice.SetRenderState D3DRS_LIGHTING, False


Direct3D هيچ مثلثي را که در ديد شما نباشد رسم نخواهد کرد . براي متوقف کردن اين امر بايستي حالت culling آنرا متوقف کنيد همچنين vertex ها را بترتيب عقربه هاي ساعت معرفي کنيد :



D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE


سپس بايد فرمت بافر Z را فعال سازيد :



D3DDevice.SetRenderState D3DRS_ZENABLE, 1

juggle
شنبه 13 شهریور 1389, 03:35 صبح
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

juggle
یک شنبه 14 شهریور 1389, 18:47 عصر
آموزشDirectX-Graphic قسمت هفتم

تعريف ماترسها

1 - World Matrix : اين ماتريس براي نگهداري تمام vertex هايي که براي رندر فرستاده مي شوند بکار مي رود . مقادير موجود در اين ماتريس ، موقعيت يک vertex را مي تواند تغيير دهد . يکي از کاربردهاي آن انجام دورانrotation ، انتقال transmittion و تغییر اندازه scaling است .
برای ساخت اين ماتريس از دستور زير استفاده می کنيم :




D3DXMatrixIdentify matworld


حال اين ماتريس را براي device مربوطه تاييد مي کنيم :




D3DDevice.SetTransform D3DTS_WORLD,matworld


۲ - View Matrix : اين ماتريس را بعنوان يک دوربين در نظر بگيريد که بوسيله يک نقطه شروع و يک نقطه پاياني مشخص مي شود ( مشابه يک up vector که معمولاً در طول محور y رو به بالاست ) :




D3DXMatrixLookAtLH matView, MakeV(0, 5, 9), MakeV(0, 0, 0),MakeV(0, 1, 0) x
D3DDevice.SetTransform D3DTS_VIEW, matView


تابع MakeV که در اينجا استفاده شده بصورت زير است :




Private Function MakeV(x As Single, y As Single, z As Single) As D3DVECTOR
MakeV.x = x
MakeV.y = y
MakeV.z = z
End Function


۳ - Projection Matrix : اين ماتريس مشخص مي کند چه منطقه اي از فضاي جهاني براي رندر کردن visible باشد . همچنين مشخص مي کند چه مقدار مي توانيم بطور افقي ببينيم ( زاويه ديد بزرگتر منجر به ديد بزرگتر مي شود ) :




D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500


در دستور فوق از زاويه ديد pi/4 راديان استفاده شده همچنين نسبت 1:1 استفاده شده است . قسمتهاي سوم و چهارم مشخص مي کنند فقط مثلثهايي کشيده شوند که با ابعاد بزرگتر از يکدهم دوربين و کوچکتر از ۵۰۰ برابر دوربين هستند .
حال دستور اختصاص به device را خواهيم داشت :




D3DDevice.SetTransform D3DTS_PROJECTION, matProj


بعد از تعريف ماتريسها بايستي تابع InitializeGeometry را صدا کنيم . در اين تابع از يک ثابت با نام DFC استفاده شده است . اگر DFC=1 باشد مکعب بطور کامل کشيده مي شود و اگر بزرگتر از يک باشد ، face هاي آن جدا از هم ديده خواهند شد . همچنين توجه کنيد که از بافرهاي vertex براي ذخيره داده vertex ها استفاده شده است . ساختار اين تابع بصورت زير خواهد بود :
۱ - پر کردن ساختارهاي vertex




'Front
Cube(0) = CreateLitVertex(-1, 1, DFC, color, 0, 0, 0)x
Cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0, 0)x
Cube(2) = CreateLitVertex(-1, -1, DFCcolor, 0, 0, 0)x
Cube(4) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)x
Cube(5) = CreateLitVertex(1, -1, DFC, color, 0, 0, 0)x
'Back
Cube(6) = CreateLitVertex(-1, 1, -DFC, color, 0, 0, 0)x
Cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(9) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)x
Cube(10) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)x
Cube(11) = CreateLitVertex(1, -1, -DFC, color, 0, 0, 0)x
'Right
Cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0, 0)x
Cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(14) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(15) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)x
Cube(16) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)x
Cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0, 0)x
'Left
Cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0, 0)x
Cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(21) = CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)x
Cube(22) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)x
Cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0, 0)x
'Top
Cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0, 0)x
Cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)x
Cube(26) = CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)x
Cube(27) = CreateLitVertex(1, DFC, 1, cocolor, 0, 0, 0)x
Cube(29) = CreateLitVertex(1, DFC, -1, color, 0, 0, 0)x
'Bottom
Cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0, 0)x
Cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(32) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(33) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)x
Cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)x
Cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)x


2 - ساخت يک بافر vertex خالي با سايز مورد نظر :



Set VBuffer = D3DDevice.CreateVertexBuffer(Len(Cube(0)) * 36, 0, Lit_FVF, D3DPOOL_DEFAULT)x


3 - پر کردن بافر مربوطه با داده ها :



D3DVertexBuffer8SetData VBuffer, 0, Len(Cube(0)) * 36, 0, Cube(0)x


حال به سراغ روتين Render مي رويم :



Public Sub Render
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0 '//Clear the screen black
D3DDevice.BeginScene
D3DDevice.SetStreamSource 0, VBuffer, Len(Cube(0))x
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub


ساختار اصلي برنامه بصورت زير خواهد بود :



Dim RotateAngle As Single
Dim matTemp As D3DMATRIX '//To hold temporary
call Initialize
Do While bRunning
RotateAngle = RotateAngle + 0.1
If RotateAngle >= 360 Then RotateAngle = RotateAngle - 360
D3DXMatrixIdentity matWorld '//Reset our world matrix
D3DXMatrixIdentity matTemp
D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180) x
D3DXMatrixMultiply matWorld, matWorld, matTemp
D3DDevice.SetTransform D3DTS_WORLD, matWorld
Render
DoEvents
Loop

juggle
سه شنبه 16 شهریور 1389, 18:04 عصر
در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم:چشمک:

moos111
چهارشنبه 17 شهریور 1389, 11:14 صبح
سلام دوست عزیز مطالبتون خیلی جابله لطفا ادامه بدین.
دوست عزیز ببین مشکل منو میشه با DirectX-Graphic حل نمود یا نه؟
به این تاپیک برو
http://barnamenevis.org/forum/showthread.php?t=244275

با تشکر

ModernWarfare
جمعه 26 شهریور 1389, 19:13 عصر
با سلام خدمت صاحب تاپیک...
من یه برنامه آموزشی گرافیکی در دست ساخت دارم و از اون جایی که خیلی از جاها نمیتونم از Flash استفاده کنم از کد های VB برای حرکت استفاده کردم...اما متاسفانه حرکت ها با کیفیت انجام نمیشه و به نظر فقط از CPU استفاده میکنه...میخاستم بدونم با این آموزش های شما میشه از GPU مستقیما استفاده کرد یا نه ؟
ممنون از مطالبتون

mohammad_mohseni
دوشنبه 05 مهر 1389, 20:58 عصر
دمت گرم .:لبخندساده::تشویق:
پس چرا ادامه نمیدی :گریه:من الان چند روز هی دارم سر میزنم ولی هیچی نیست ،خواهشا زود تر:عصبانی++::ناراحت:

xxxxx_xxxxx
دوشنبه 05 مهر 1389, 23:01 عصر
دمت گرم .:لبخندساده::تشویق:
پس چرا ادامه نمیدی :گریه:من الان چند روز هی دارم سر میزنم ولی هیچی نیست ،خواهشا زود تر:عصبانی++::ناراحت:
زیر نام کاربری ایشون نوشته شده: "محروم شده" یعنی دیگه به انجمن دسترسی ندارند. پس در نتیجه نمی تونند ادامه بدن.

mehrdad2025
یک شنبه 10 بهمن 1389, 23:29 عصر
سلام به همه دوستان.
کسی می تونه Directx رو کامل با کدهای #C آموزش بده؟
یا اصلا کتابی در این زمینه هست.از کمک کنندهگان ممنون خواهم شد.
با تشکر مهرداد