صفحه 1 از 3 123 آخرینآخرین
نمایش نتایج: از شماره 1 تا 10 , از مجموع 30

موضوع: آموزش DirectX-Graphic

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض آموزش 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 را برمي گرداند :


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  2. #2
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    public function initialise () as boolean
    Dim DispMode as D3DISPLAYMODE


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


    Dim D3Dwindow as D3DPRESENT_PARAMETERS


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


    Set Dx=New DirectX8


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


    ()set D3D.Dx.Direct3Dcreate


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


    D3D.getadapterdisplaymode D3DADAPTER_DEFAULT,dispmode


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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  3. #3
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  4. #4
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

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


    Set D3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT
    ,D3DDEVTYPE_HAL,
    frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    D3Dwindow)x,
    end sub


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


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


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


    D3DDevice.beginscence
    all rendering calls go between these two lines '
    D3DDEvice.endscence


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


    D3DDevice.present byval 0,byval 0,0,byval 0


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  5. #5
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    موضوع : بدست آوردن مشخصات و تواناييهاي گرافيکي يک سيستم توسط 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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  6. #6
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

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


    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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  7. #7
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  8. #8
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    موضوع : رسم اشکال دو بعدي

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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  9. #9
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    فرض کنيد بخواهيم يک مربع را در صفحه رسم کنيم . براي رسم آن نياز به 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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

  10. #10
    مدير باز نشسته
    تاریخ عضویت
    Jan 1970
    محل سکونت
    Tabriz
    نوشته ها
    5,550
    تشکر تشکر کرده 
    7,087
    تشکر تشکر شده 
    8,503
    تشکر شده در
    2,353 پست
    قدرت امتیاز دهی
    1938
    Array

    پیش فرض

    تابع 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


    93365739541900062743
    profilephpid100002248043280

    22771097565880345367
    facebook

    23759482593804762228
    NewGame7191

صفحه 1 از 3 123 آخرینآخرین

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

علاقه مندی ها (بوک مارک ها)

علاقه مندی ها (بوک مارک ها)

مجوز های ارسال و ویرایش

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

http://www.worldup.ir/