نمایش نتایج 1 تا 22 از 22

نام تاپیک: آموزش DirectX-Graphic

  1. #1
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Thumbs up آموزش DirectX-Graphic

    برگرفته از کتاب 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
    --------------------
    در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم
    آخرین ویرایش به وسیله xxxxx_xxxxx : پنج شنبه 29 مهر 1389 در 04:54 صبح دلیل: ذکر منبع

  2. #2
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  3. #3
    کاربر دائمی آواتار M.T.P
    تاریخ عضویت
    دی 1388
    محل زندگی
    Planet Earth
    پست
    1,769

    نقل قول: آموزش DirectX-Graphic

    لطفا ادامه بدید...

  4. #4
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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



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


    در صورتی که دوستان علاقه خود رو نسبت به این تاپیک نشان دهند قسمت های بعدی مطلب را قرار میدهم
    آخرین ویرایش به وسیله juggle : یک شنبه 07 شهریور 1389 در 14:59 عصر

  5. #5
    کاربر دائمی آواتار returnx
    تاریخ عضویت
    فروردین 1389
    محل زندگی
    ?
    پست
    1,190

    نقل قول: آموزش DirectX-Graphic

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

  6. #6
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

    آموزش 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 : یک شنبه 07 شهریور 1389 در 15:02 عصر

  7. #7
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  8. #8
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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


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

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

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

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

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

  9. #9

    نقل قول: آموزش DirectX-Graphic

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

  10. #10

    Red face نقل قول: آموزش DirectX-Graphic

    مطالب خیلی جالب و کاربردیه

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

  11. #11
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  12. #12
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Wink نقل قول: آموزش DirectX-Graphic

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

  13. #13
    کاربر دائمی آواتار MMR_1344
    تاریخ عضویت
    آذر 1384
    محل زندگی
    تهران
    پست
    630

    نقل قول: آموزش DirectX-Graphic

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

  14. #14
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  15. #15
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  16. #16
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  17. #17
    کاربر تازه وارد آواتار juggle
    تاریخ عضویت
    تیر 1389
    محل زندگی
    یه خورده بالا تر
    پست
    55

    Post نقل قول: آموزش DirectX-Graphic

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

  18. #18

    نقل قول: آموزش DirectX-Graphic

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

    با تشکر

  19. #19

    نقل قول: آموزش DirectX-Graphic

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

  20. #20

    Unhappy نقل قول: آموزش DirectX-Graphic

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

  21. #21
    VIP آواتار xxxxx_xxxxx
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    X place
    سن
    34
    پست
    4,768

    نقل قول: آموزش DirectX-Graphic

    نقل قول نوشته شده توسط mohammad_mohseni مشاهده تاپیک
    دمت گرم .
    پس چرا ادامه نمیدی من الان چند روز هی دارم سر میزنم ولی هیچی نیست ،خواهشا زود تر
    زیر نام کاربری ایشون نوشته شده: "محروم شده" یعنی دیگه به انجمن دسترسی ندارند. پس در نتیجه نمی تونند ادامه بدن.
    الگوریتم هایی که تاریخچه خود را فراموش می کنند، محکوم به تکرار آن هستند.

  22. #22
    کاربر تازه وارد
    تاریخ عضویت
    مهر 1388
    محل زندگی
    تبریز
    پست
    74

    نقل قول: آموزش DirectX-Graphic

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

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •