# Native Code > برنامه نویسی در 6 VB > برنامه نویسی مرتبط با بازی و گرافیک در VB6 > آموزش: آموزش DirectX-Graphic

## juggle

*برگرفته از کتاب 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 تصوير را مشخص مي کنيم ( در اينجا چند انتخاب وجود دارد که در صورت نياز به اطلاعات بيشتر *با من* تماس بگيريد . ) :
 
 
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

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

----------


## M.T.P

لطفا ادامه بدید...  :تشویق:

----------


## juggle

*آموزش 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

لطفا کد ها رو در تگ(Tag)کد قرار بدید تا خوانا باشه. :چشمک:

----------


## juggle

*آموزش 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

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

----------


## juggle

*آموزشDirectX-Graphic قسمت چهارم* 

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

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

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

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

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

----------


## behzad_lover

*کارتون عالیه. ادامه بدید...*

----------


## FULLSYSTEM

مطالب خیلی جالب و کاربردیه :تشویق: 

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

----------


## juggle

*آموزش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

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

----------


## MMR_1344

دوست عزیز 
از زحمتی که میکشید و این بخش رو ایجاد کرده اید متشکرم اگر ادامه بدهید ممنون خواهیم بود

----------


## juggle

*آموزش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

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

----------


## juggle

*آموزش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

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

----------


## moos111

*سلام دوست عزیز مطالبتون خیلی جابله لطفا ادامه بدین.
دوست عزیز ببین مشکل منو میشه با* *DirectX-Graphic حل نمود یا نه؟
به این تاپیک برو
*https://barnamenevis.org/showthread.php?t=244275

با تشکر

----------


## ModernWarfare

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

----------


## mohammad_mohseni

دمت گرم . :لبخند:  :تشویق: 
پس چرا ادامه نمیدی  :گریه: من الان چند روز هی دارم سر میزنم ولی هیچی نیست ،خواهشا زود تر :خیلی عصبانی:  :ناراحت:

----------


## xxxxx_xxxxx

> دمت گرم .
> پس چرا ادامه نمیدی من الان چند روز هی دارم سر میزنم ولی هیچی نیست ،خواهشا زود تر


زیر نام کاربری ایشون نوشته شده: "محروم شده" یعنی دیگه به انجمن دسترسی ندارند. پس در نتیجه نمی تونند ادامه بدن.

----------


## mehrdad2025

سلام به همه دوستان.
کسی می تونه Directx رو کامل با کدهای #C آموزش بده؟
یا اصلا کتابی در این زمینه هست.از کمک کنندهگان ممنون خواهم شد.
با تشکر مهرداد

----------

