آموزش دایرکت ایکس

سلام خدمت بينندگان عزيز اين وبلاگ

خب همونطور كه قبلآ قول داده بودم در مورد آموزش سه بعدي امروز يه برنامه رو از صفر با دايركت ايكس 8و وي بي مي سازيم تا شما با چگونگي رسم اشكال سه بعدي ساده (مكعب و استوانه و..) آشنا بشيد.

خب اول از منوي پروژه تو وي بي ريفرنس رو انتخاب كنيد در ليست باز شده تيك  DirectX8 For VisoualBasic Librery رو بزنيد تا كتابخونش به پروژتون اضافه بشه .

بعد از منوي پروژه Add Module رو بزنيد تا يه انبار كد يا ماژول به پروژتون اضافه بشه از اين ماژولها برا اين استفاده مي كنن كه

اولآ متغير و يا تابعي كه داخل ماژول نوشته بشه از داخل همه ي فرمها قابل دسترسي و صدا زدنه چون متغيير هاي سطح ماژول بر خلاف فرم به صورت پيش فرض Public هستند

خب داخل ماژول يه ديتا تايپ براي ذخيره سازي اطلاعات تك تك نقطه ها تعريف مي كنيم

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)
Global Const Pi = 3.14159265358979

ثابت پي هم كه براي محاسبه زاويه اي بكار مي رود –چرخش دوربين
بعد يه آرايه به تعداد نقطه هايي (ورتكس هايي)كه مي خوايم رسم كنيم تعريف مي كنيم

Public cube(35) As LITVERTEX
Public matworld As D3DMATRIX
Public matview As D3DMATRIX
Public matproj As D3DMATRIX

چون ما مي خوايم يه مكعب مربع رسم كنيم به 36 نقطه نياز داريم كه با آرايه بالا اونو تعريف مي كنيم در سه خط بعد سه تا ماتريس تعريف كرديم كه كل خصوصيات نقاط ما رو داخل خودشون نگه مي دارن كاربرد اونا اينه كه براي تابع چرخش فرستاده مي شن و كل اونا رو دايركت ايكس يه جا مي چرخونه و ديگه نياز به چرخش تك تك اونها نيست
ماتريس اول چگونگي قرار گرفتن نقطه ها در فضاي سه بعدي رو نشون مي دن
دومين ماتريس نشان مي دهد دور بين در كجا قرار دارد
وآخرين ماتريس نشان مي دهد كه دوربين چگونه به صحنه نگاه مي كند
بعد متغيير هاي سراسري سطح ماژول رو كد نويسي مي كنيم توجه كنيد تمام كدهاي بالا واين كدها داخل ماژول نوشته مي شن

Public Dx As DirectX8
Public D3D As Direct3D8
Public D3DDevice As Direct3DDevice8
Public DispMode As D3DDISPLAYMODE
Public InitG As Boolean
Public D3Dwindow As D3DPRESENT_PARAMETERS
Public D3DX As D3DX8
Public VBuffer As Direct3DVertexBuffer8

دي ايكس بزرگترين كلاس دايركت ايكس است كه كلاس هاي دايركت ايكس را مديريت مي كند.
كلاس دي تري دي براي ايجاد ابزار سه بعدي سازي استفاده مي شه.
كلاس D3dDevice براي مديريت ابزار ساخته شده و اجزاي آن استفاده مي شه.
كلاس DispMode براي گرفتن موقعيت و خصوصيات كنوني صفحه نمايش شما بكار مي رود.
متغير InitG براي گرفتن مقدار برگشتي تابع InitialiseGeometry كه بعدآ تعريف خواهد شد بكار مي رود.
كلاس D3Dwindow مستقيمآ با پنجره نمايش ما كار مي كند وبراي تظيم خصوصيات آن از اين كلاس استفاده مي شود.
كلاس D3DX براي ايجاد يك بافت و بارگزاري فايل دات ايكس كه فايل حاوي مختصاي نقاط ومشخصات يك شي سه بعدي مي باشد(فايل هاي خروجي 3DSMAX با يك برنامه به اين نوع فايل تبديل مي شوند و داخل دايركت ايكس باز مي شوند)بكار مي رود مثلآ اگر بخواهيد روي يك ديوار يك عكس بيندازيد بايد با اين كلاس آن را بارگذاري كنيد وبا كلاس D3DMaterial8 آن را به ديوار بيندازيد. صرفآ در اين پروژه نيازي به اين كلاس نيست و من اون رو همينجوري تعريف كردم!.
كلاس vBuffer براي ايجاد بافر نگه دارنده كل نقاط و تصوير سه بعدي ما استفاده مي شود
حالا شروع به نوشتن تابع initialise مي كنيم اين تابع در اكثر پروژه هاي سه بعدي هست و وظيفه اش بارگزاري و مقداردهي اوليه كلاسها و متغيير هاست .

Public Function initialise() As Boolean
Set Dx = New DirectX8 '— ايجاد دوباره كلاس دي ايكس
Set D3D = Dx.Direct3DCreate '— ايجاد كلاس دي تري دي از كلاس دي ايكس
'-- D3DDEVTYPE_REF= رسم نرم افزاري , D3DDEVTYPE_HAL= رسم سخت افزاري
'--ممكن است كارت گرافيك شما آن برد باشد كه بايد از هال استفاده كنيد
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
Debug.Print "yes"

End If
'— بررسي اينكه آيا سخت افزار ما قادر به رسم نقاط سه بعدي هست يا نه

D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode
'— گرفتن خصوصيات كنوني تصوير و ريختن آن در ديتاتايپ ديسپ مود
D3Dwindow.Windowed = 1
'— 1 يعني برنامه ما بصورت پنجره ايجاد شود –2=تمام صفحه
D3Dwindow.BackBufferFormat = DispMode.Format
'— خصوصيات صفحه را كه گرفته ايم به دايركت ايكس مي دهيم
'— وبافرنگهدارنده تصوير رابا آن تنظيم مي كنيم
D3Dwindow.SwapEffect = D3DSWAPEFFECT_DISCARD
D3Dwindow.BackBufferCount = 1
D3Dwindow.BackBufferFormat = DispMode.Format
D3Dwindow.BackBufferHeight = DispMode.Height
D3Dwindow.BackBufferWidth = DispMode.Width
D3Dwindow.hDeviceWindow = Form1.hWnd

'—D3D ايجاد ابزار سه بعدي سازي با مشخصات مقداردهي شده ي بالا از كلاس
Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, _
Form1.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3Dwindow)
'— مشخص كردن پنجره رسم تصاوير در خط بالا
'— پاك كردن ابزار سه بعدي سازي با رنگ سياه (پارامتر آخر خط پايين)
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, &H0, 1#, 0
'— دادن ماتريس تعريف شده به دايركت ايكس
D3DXMatrixIdentity matworld
D3DDevice.SetTransform D3DTS_WORLD, matworld
'— تنظيم ماتريس بعدي تعريف شده براي استفاده در چرخش تصوير
D3DXMatrixLookAtLH matview, MakeV(0, 5, 9), MakeV(0, 0, 0), MakeV(0, 1, 0)
'— تنظيم نماي ديد اوليه به كمك تابع ميك وي كه بعدآ تعريف خواهد شد
D3DDevice.SetTransform D3DTS_VIEW, matview
'— دادن ماتريس سوم به دايركت ايكس براي تنظيم نماي ديد
D3DXMatrixPerspectiveFovLH matproj, Pi / 4, 1, 0.1, 500
'— تنظيم نماي پرسپكتيو با استفاده از عدد پي
D3DDevice.SetTransform D3DTS_PROJECTION, matproj
'— تنظيم نوع انتقال و جابجايي در محيط سه بعدي
D3DDevice.SetVertexShader Lit_FVF
'— تنظيم سيستم سايه زني با ديتا تايپي كه تعريف كرده ايم
D3DDevice.SetRenderState D3DRS_LIGHTING, False
'— سيستم نور پردازي را براي محاسبات راحت تر وساده تر غير فعال مي كنيم
InitG = InitialiseGeometry
'— تابع بالا را براي مقدار دهي نقطه ها صدا مي زنيم اگر نتيجه
'-- اين تابع نادرست باشد مقداردهي انجام نشده است
Set VBuffer = D3DDevice.CreateVertexBuffer(Len(cube(0)) * 36, 0, Lit_FVF, D3DPOOL_DEFAULT)
'— ايجاد بافر با طول آرايه اي كه تعريف كرده ايم
D3DVertexBuffer8SetData VBuffer, 0, Len(cube(0)) * 36, 0, cube(0)
'— ريختن آرايه درون بافر
If initGt = True Then Initialize = True
'— درصورتي كه مقدار برگشتي تابع اي كه صدا زديم درست باشد خروجي اين تابع هم درست است
Debug.Print InitG
End Function

خب خسته نباشيد حالا دو تابعي كه در بالا صدا زديم و گفتيم بعدآ تعريف مي كنيم را مي نويسيم تابع MakV براي تبديل پامتر هاي عددي به ساختار D3DVECTOR كه ديتا تايپ استاندارد دايركت ايكس است

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

بعدي تابع رسم مقدار دهي نقطه ها در فضاي سه بعدي است يعني تابع InitialiseGeometry


Private Function InitialiseGeometry() As Boolean
On Error GoTo BOut:
Dim color&, DFC!
'— تنظيم رنگ نقاط در اينجا رنگ آبي
color = RGB(200, 100, 0): DFC = 1

'Front
cube(0) = CreateLitVertex(-1, 1, DFC, color, 0, 0, 0)
cube(1) = CreateLitVertex(1, 1, DFC, color, 0, 0, 0)
cube(2) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)
cube(4) = CreateLitVertex(-1, -1, DFC, color, 0, 0, 0)
cube(5) = CreateLitVertex(1, -1, DFC, color, 0, 0, 0)
'Back
cube(6) = CreateLitVertex(-1, 1, -DFC, color, 0, 0, 0)
cube(7) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)
cube(8) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)
cube(9) = CreateLitVertex(1, 1, -DFC, color, 0, 0, 0)
cube(10) = CreateLitVertex(-1, -1, -DFC, color, 0, 0, 0)
cube(11) = CreateLitVertex(1, -1, -DFC, color, 0, 0, 0)
'Right
cube(12) = CreateLitVertex(-DFC, 1, -1, color, 0, 0, 0)
cube(13) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)
cube(14) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)
cube(15) = CreateLitVertex(-DFC, 1, 1, color, 0, 0, 0)
cube(16) = CreateLitVertex(-DFC, -1, -1, color, 0, 0, 0)
cube(17) = CreateLitVertex(-DFC, -1, 1, color, 0, 0, 0)
'Left
cube(18) = CreateLitVertex(DFC, 1, -1, color, 0, 0, 0)
cube(20) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)
cube(21) = CreateLitVertex(DFC, 1, 1, color, 0, 0, 0)
cube(22) = CreateLitVertex(DFC, -1, -1, color, 0, 0, 0)
cube(23) = CreateLitVertex(DFC, -1, 1, color, 0, 0, 0)
'Top
cube(24) = CreateLitVertex(-1, DFC, 1, color, 0, 0, 0)
cube(25) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)
cube(26) = CreateLitVertex(-1, DFC, -1, color, 0, 0, 0)
cube(27) = CreateLitVertex(1, DFC, 1, color, 0, 0, 0)
cube(29) = CreateLitVertex(1, DFC, -1, color, 0, 0, 0)
'Bottom
cube(30) = CreateLitVertex(-1, -DFC, 1, color, 0, 0, 0)
cube(31) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)
cube(32) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)
cube(33) = CreateLitVertex(1, -DFC, 1, color, 0, 0, 0)
cube(34) = CreateLitVertex(-1, -DFC, -1, color, 0, 0, 0)
cube(35) = CreateLitVertex(1, -DFC, -1, color, 0, 0, 0)
InitialiseGeometry = True
Exit Function
BOut:
InitialiseGeometry = False
End Function
تابعي كه داخل اين تابع صدا زده شده تابع CreateLitVertex هست كه مشخصات نقطه رو به فرمت استاندارد LITVERTEX تبديل مي كنه .متن اين تابع:
Private Function CreateLitVertex(x As Single, y As Single, z As Single, color As Long, specular As Long, tu As Single, tv As Single) As LITVERTEX
CreateLitVertex.x = x
CreateLitVertex.y = y
CreateLitVertex.z = z
CreateLitVertex.color = color
CreateLitVertex.specular = specular
CreateLitVertex.tu = tu
CreateLitVertex.tv = tv
End Function
و تابع اصلي رسم نقاط در فضاي سه بعدي كه در تمامي پروژه هاي سه بعدي اسم اون Render هست.
Public Sub Render()
'— پاك كردن تصوير قبلي رسم شده با رنگ سياه
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0
'— شروع رسم تصوير سه بعدي
D3DDevice.BeginScene
'— دادن بافر حاوي نقطه هاي سه بعدي به تابع رسم كننده
D3DDevice.SetStreamSource 0, VBuffer, Len(cube(0))
'— رسم نقاط به صورت مثلثي
'-- D3DPT_LINELIST رسم خطي
'-- D3DPT_LINESTRIP رسم خط چسبيده
'-- D3DPT_POINTLIST رسم نقطه اي
'-- D3DPT_TRIANGLEFAN رسم مثلثي
'--D3DPT_TRIANGLELIST رسم مثلث چسبيده
'-- D3DPT_TRIANGLESTRIP رسم درهم بافته
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
'— پايان رسم تصوير سه بعدي
D3DDevice.EndScene
'-- تثبيت نقاطه رسم شده
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

 

خب كد نويسي بخش ماژول تموم شد حالا فرم رو بازكنيد و خط اول كد هاش متغيير زير رو تعريف كنيد

 

Dim Er As Boolean

 

بعد در كد Form_KeyDown كد زير را به اينصورت بنويسيد كه كل دستو به اين شكل مي باشد

 

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Er = True
End Sub

با اين دستور وقتي كاربر كليدي را يزند ير نامه تمام مي شود
حالا كد مربوط به فرم لود كه بايد توابعي را كه در ماژول تعريف كرديم را داخل يك حلقه بي پايان صدا بزنيم .روي فرم دابل كليك كرده كد زير را بنويسيد

Private Sub Form_Load()
Debug.Print "Start"
Me.Show
Dim RotateAngle As Single'— براي ذخيره ميزان چرخش
Dim matTemp As D3DMATRIX '//To hold temporary
Call initialise'— صدا زدن تابع براي مقدار دهي اوليه نقاط وايجاد وتنظيم پارامترها
While Er = False'— شروع حلقه بي پايان
RotateAngle = RotateAngle + 0.1'— يك درجه به چرخش اضافه كن
If RotateAngle >= 360 Then RotateAngle = RotateAngle – 360'— اگر يك دور كامل شد برگرد
D3DXMatrixIdentity matworld '//Reset our world matrix— تنظيم ماتريس نقاط با چرخش
D3DXMatrixIdentity matTemp'— تنظيم محل دوربين با چرخش
D3DXMatrixRotationX matTemp, RotateAngle * (Pi / 180)'— گردش افقي دوربين
D3DXMatrixMultiply matworld, matworld, matTemp '— دادن سه ماترس مزكور به دايركت ايكس
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (Pi / 180)'— گردش عمقي دوربين
D3DXMatrixMultiply matworld, matworld, matTemp'— دادن سه ماترس مزكور به دايركت ايكس
D3DDevice.SetTransform D3DTS_WORLD, matworld'— تنظيم محل ديد دوربين
Render'— صدا زدن تابع اصلي رسم
DoEvents'— همه دستورات را دوباره بررسي كن (داخل حلقه هنك نكن!!)
Wend'— پايان حلقه بي پايان
End'— بستن برنامه
End Sub

دستور End رو داخل Form_Unload هم مي نويسيم كه برنامه بازدن دكمه كلوز خطا نده

Private Sub Form_Unload(Cancel As Integer)

End
End Sub

خب چيزي نموند كه توضيح نداده باشيم
براي اينكه برنامه شما رو كامل كرده باشم اگه جايي اشتباه تايپي باشه يا غيره كد كامل برنامه رو هم گزاشتم كه مي تونيد از داخل گوني زير برش داريد.!
كدماژول

كد فرم

دليل تاخير-مقاله

سلام

اولین چیز سورس پلیره که بعد از این همه وقت گزاشتمش رو وب اوایل ۲۰۰۷ نوشتمش

Download

Player Audio & Video

اون سایته که می گفتم با پی اچ پی تمومش کزدم پی اچ پی با آژاکس چی می شه !! به همتون توصیه می کنم براش هم نمی خاد هاست بگیرید یه آکانت توی Paresehgig.comدر ست كنيد همين

يه تالار ديگه هم بصورت آزمايشي اضافه كردم

فعلآ در گير برنامه يه بانكم .پروژه نمايندگي شركت خودروسازي رو هم گرفتم كه مونده برا بعد عيد

روبوكاپ هم فعلآ تعطيل شده و اينكه يه فرمت تصويري ساختم كه حجم فايلاش نصف تري جي پي هست 100مگ در 15 مگ!!!!! به زودي سرو صداش رو از رسانه ها خاهيد شنيد.

هنوز وقت ثبتش رو پيدا نكردم.

واينكه به زودي كارهام رو با دايركت ايكس و اوپن جي ال رو مي زارم رو وب.

و در انتخابات هم كارشناس رايانه ام

با اين همه كار طبيعيه اين همه تاخير ولي بازم از همه خوانندگان گل اين وبلاگ كه مثل هميشه شرمنده كردن معزرت مي خوام

آقا هادي هم هر وقت آمادگي داشتي وعشقت كشيد بگو تا به عنوان يك نويسنده به وبلاگ اضافت كنم

تا پست بعدي خدانگه دارتان

-مردان بزرگ اراده مي كنند مردان ضعيف آرزو(همينجوري عشقي نوشتم منظوري ندارم!!!!)

مقاله1 : آموزش کامل Ftp با تمام ریزه کاریها
مقاله2 : ساخت یک پورت اسکنر به زبان Php (نویسنده: شهریار جلایری)
پیوند3 :اسکنر Php ساخته شده
عکس هاي ضميمه
نوع فايل: pdf FTP Commands.pdf (70.2 کيلو بايت, 27 views)
نوع فايل: pdf php port Scanner.pdf (117.0 کيلو بايت, 23 views)
فايل هاي ضميمه
نوع فايل: rar scanner.rar (242 بایت, 18 views)
Numbers
Standard Port Numbers
فايل هاي ضميمه
نوع فايل: zip Standard Port Numbers.zip (128.0 کيلو بايت, 17 views)
مقاله تغیر سطح دسترسی یا همون change permision

سلام اینم مقاله تغیر سطح دسترسی یا همون change permision (برای نصب جوملا یا phpbb یا ...) منبع
www.7rah.com
عکس هاي ضميمه
نوع فايل: pdf change permision.pdf (159.5 کيلو بايت, 24 views)
cloning
mac address cloning
عکس هاي ضميمه
نوع فايل: pdf mac address cloning.pdf (157.
BLOG-Hacking

BLOG-Hacking آموزش وبلاگ داری و هک آن
عکس هاي ضميمه
نوع فايل: pdf BLOG-Hacking.pdf (647.6 کيلو بايت, 36 views)
آموزش نصب ipb

آموزش نصب ipb و فارسی کردن آن
عکس هاي ضميمه
نوع فايل: pdf ipb_persian.pdf (136.4 کيلو بايت, 20 views)
نام مقاله : مباحثی پیرامون سرریز در پشته
نویسنده : شهریار جلایری «30 صفحه است و مقاله بی نظیریه»
عکس هاي ضميمه
نوع فايل: pdf Stack Overflow Vulnerability Disclose.pdf (411.6 کيلو بايت, 40 views)
این هم مقاله ایی خوب در زمینه معرفی کتاب های هک شبکه و برنامه نوسی
برای هکر های مبتدی.
عکس هاي ضميمه
نوع فايل: pdf guide-001.pdf (97.8 کيلو بايت, 47 views)

نام کتاب : اکسپلویتینگ و سوکت نویسی با Php
نویسنده : شهریار جلایری
عکس هاي ضميمه
نوع فايل: pdf Socket Programming and Exploiting with PHP.pdf (454.6 کيلو بايت, 74 views)
این فایل رو هم ضمیمه می کنم که شک شما بر طرف بشه
عکس هاي ضميمه
نوع فايل: pdf TelnetHack.pdf (66.0 کيلو بايت, 50 views)

جواب یه نظر

در پی نظر نگار خانم برا کتب سی پلاس پلاس این پست رو انجام می دم

اولیش کتاب آقای جفر نژاد قمی هست که در دو نوع سی++ وسی عرضه شده

کتاب بعدی مثل همیشه کتب برادران دیتل هست که بسیار کامل هست البته  من یه سری کتب الکترونیکی تو وبلاگ معرفی کردم که می تونید از جستجوگر استفاده کنید برا پیدا کردنش

تو این پست فقط وبلاگ معرفی می کنیم

http://cppprograms.blogfa.com/ برا علی آقا

http://sstarsprograms.blogfa.com/

http://cppcenter.blogfa.com/

 

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

سلام خدمت بازديدكنندگان اين وبلاگ

ديگه دو ماهي مي شه پستهام با ببخشيد شرمند دير شد شروع مي شد وعجله اي امروز كه يه هفته بعد از امتحانات پايان ترمه و انتخاب واحدم تموم شده من سايتي كه داشتم طراحي مي كردمو تحويل دادم و فرصت شد بشينم يه دل سير مقاله بنويسم .

امير حسين در مورد فرق دايركت ايكس و جي ال خواسته بود:

1-كل حجم جي ال در ويندوز 5مگ بيشتر نيست در حالي كه براي دانلود يه ورژن دايكركت ايكس بين 60 تا 80 مگابايت هست ورژن 10 دويست وپنجاه مگ!!

2-سرعت جي ال بخاطر نوع رندر تصاوير و فايلهاي كم در بافر وجزئيات كمتر بيش از 3 برابر بيشتر از دايركت ايكس هست

3-به دليل استفاده گسترده از وراثت و چند ريختي(پوليمورفيزم)اكثركلاسهاي دايركت ايكس بهم مربوط اند وبا همديگر متحد ويكپارچه كار مي كنند لذا وابسته بهم هستند از اينرو اگه سخت افزاري يكي از كلاسها يا امكانات دايركت ايكس رو پشتيباني نكنه در اجراي بقيه كلاسها هم ايجاد مشكل مي كنه به همين خاطر دايركت ايكس ابتدا تست مي كنه كه اين افكت يا كلاس با امكانات سخت افزاري موجود اجرا مي شه يا نه .اگه جواب مثبت بود برنامه اجرا مي شه

ولي جي ال به دليل اجراي تقريبآ مستقل كلاسهاش در هرسيستمي بالا ترين افكتها رو هرچند كند و با كيفيت كمتر ولي پياده واجرا مي كنه

4-جي ال به دليل عدم وابستگي به اي پي آي در هر سيستمي اجرا مي شه يعني اگه ورژن لينوكس اون رو از سايت OpenGL.orgدانود كنيد مي تونيد تو محيط KWriteلينوكس براش كد نويسي كنيد.كنسول جاواي اوپن جي الJOGL به راحتي روي يك گوشي با حافظه 32مگ و بيشتر اجرا مي شه و روي تمام گوشي هاي پشتيبان فايل .Jarاجرا مي شه در حالي كه SDKمايكروسافت رو اگه با دايركت ايكس بريزي روي يه رم 512 به زور جا مي شه چه برسه به خود برنامه !!دايركت ايكس روي ويندوز ان تي هم به سختي اجرا مي شه!

5-اوپن جي ال به دليل اوپن سورس بودن كوچكترين نقطه ضعفش توسط برنامه نويسان سراسر جهان كشف و ترميم مي شه در حالي كه مايكروسافت يعد از اين كه شركت D3Dرو در دهه نود خريد ورسمآ دايركت ايكس رو انحصار كرد يك خط هم از سورس اون رو منتشر نكرده

6-دايركت ايكس به دليل بافر كردن گسترده فايلها و پلاگين ها فضاي زيادي از رم رو اشغال مي كنه كه در نتيجه هم رم بالايي برنامه هاش مي خواد هم خيلي زود هنك مي كنه هم وقتي هنك مي كنه كل سيستم رو دچار مشكل مي كنه كه اكثرآ ريسيت كردن سيستم آخرين راه موجود هست.حتي نقاط و ورتكس ها براي رندر شدن نياز دارن داخل يه آرايه به اسم FVFريخته بشن

7-ياد گيري جي ال به مراتب ساده تر از دايركت ايكس هست كدها اكثرآ خوانا بدون كوچكترين ابهام و با پيروي از قانون خاصي

متغير ها و كلاسها نام گذاري شده اندو انتقال يك كد از دايركت ايكس به جي ال خيلي ساده تر از حالت عكس هست

8-كتابخانهGLUدر جي ال يراي ترسيم بعضي از اشكال از پيش آماده مثل كره استوانه قوري و مكعب وغيره مي باشدOpenALبراي كار با صداSDLبراي كار با جويستيك وساير سخت افزارهاGLUTهم براي كار و ساخت پنجره ها كنترل هاي ويندوزدر جي ال مي باشد كه كاملآ جداگانه ومستقل در هر سيستم عاملي قابل دسترس هستند ولي براي دايركت ايكس مثلآ دايركت ساند دايركت اينپوت و غيره محدوده مشخصي ندارند فايلهاي آنها مشخص نيست و همه جا قابل اجرا ودسترسي نيستند.

9-دايركت ايكس براي اجرا شدن نياز به نسخه دايركت ايكسي دارد كه برنامه با آن نوشته شده است در كامپيوتر كاربر دارد

براي ما شايد اين كار زياد سخت نباشد يعني نصب آن ولي در كشور هايي كه كپي رايت رعايت مي شود ويندوز 200دلار است وويژوال استديو 400دلار وضعيت را خودتان پيش بيني كنيدضمن اينكه كار كردن با دايركت ورژن هاي مختلف كمي با هم تفاوت دارد و دستورات دي ايكس7 با هشت تفاوت زيادي دارد ولي در جي ال چنين نيست

10-گزينه هاي بالا حاصل مدتها كار اينجانب با هردوي اين سيستمها بود و ممكن است افراد حرفه اي نظر ديگري داشته باشند و مطالب بالا شايد از نظر افراد حرفه اي درست نباشد ولي تجربه شخصي من اينها هستند

موارد زير توسط جي ال بسيار بهتر از دي ايكس ساپورت مي شود

Picking Support

Stereo Rendering

Hardware Independent Z Buffer Access

Accumulation Buffers

Line Width Rendering Attributes

Two-Side Lighting

Hierarchical Display Lists

Picking Support:

اين گزينه به جي ال امكان مي دهد تا ذرات بسيار ريز مانند گرد و غبار را به وضوح كامل به نمايش بگذارد ياد آور مي شوم اين گزينه در دي ايكس با كمي ضعف ايجاد مي شود.و آن چيزي كه برتري جي ال است پيش فرض بودن اين گزينه است ولي در دي ايكس اين گزينه نياز به اي پي آي و كد نويسي فراوان دارد

برتري هاي دايركت ايكس

1-پشتيباني گسترده مايكروسافت از آن

2-ايجاد صحنه ها با جزئيات بسيار زياد و حرفه اي

3-نياز به كدهاي پيچيده ولي كوتاه

4-آبديت هر ساله آن

5-پشتيباني آن در ويندوز ويستا

6-استفاده از تمام قابليت هاي سخت افزار

7-و اينكه دوستان من كه در زمينه سي شارپ تخصص داشتند مي گفتند كدهاي جي ال خيلي زود ياز مي شوند

ومهندسي معكوس در دايركت ايكس بسيار مشكل است هرچند كه نرم افزارهايي براي جلوگيري از مهندسي معكوس وجود دارد كه با عث برهم زدن آرايش كدها باعدم تاثير در اجراي آن مي شود.

و موارد زير

Fixed-Function Vertex Blending

Programmable Vertex Blending

Programmable Pixel Shading

Triadic texture Blending Operations

Bump Mapping

Multiple Monitor Support

مطالب ویکی پدیا در مورد اوپن جی ال

OpenGL به معنای کتابخانه گرافیکی منبع باز(اُپن سورس) است که توسط شرکتی به نام Sillicon Graphic در کشور ایالات متحده آمریکا ساخته شده است . در حقیقت این ابزار یک شتابدهنده گرافیکی است که به برنامه نویس قابلیت اجرای گرافیک با کیفیت و سرعت بالا را که در سیستم های عامل به صورت پیش فرض امکان آن نیست را می دهد . این قابلیت با ویژگی کار در 3D که GDI و دیگر سیستم های مشابه قابلیت کار در آن را ندارند همراه است . مثلاً اگر بخواهید در VC یک مکعب رسم کنید که بتواند با سرعتی بالا و بدون به هم ریزی نمای سه بعدی آن بچرخد باید از توابع رسم خط و نقطه در دو بعد استفاده کنید که نمی توان بدون پرش فریمها این مکعب را چرخاند ولی در GL فقط محیط را به صورت 3D آماده می کنیم و سپس شی را درون این محیط رسم می کنیم حال حتی اگر شی هم بچرخد دیگر فریمها پرشی نخواهند داشت .

 محتویات GL

این کتابخانه شامل سه قسمت متفاوت ولی هماهنگ است که به زبان سی (C)نوشته شده است.

  1. کتابخانه عمومی : این کتابخانه شامل توابع و ثوابت عمومی مورد استفاده در GL است.
    1. کتابخانه عمومی زمان اجرا :opengl32.dll
    2. کتابخانه عمومی زمان ترجمه یا کامپایل : opengl32.lib
    3. کتابخانه عمومی زمان برنامه نویسی : gl.h
  2. کتابخانه کمکی : این کتابخانه شامل توابع ترسیمات غیر استاتیک و ثوابت کنترل های اختصاصی بر روی کارتهای گرافیکی و GDI می باشد .
    1. کتابخانه کمکی زمان اجرا :glu32.dll
    2. کتابخانه کمکی زمان ترجمه یا کامپایل : glu32.lib
    3. کتابخانه کمکی زمان برنامه نویسی : glu.h
  3. کتابخانه صدا : این کتابخانه شامل چندین قسمت است که به برنامه نویس قابلیت کنترل ابزار صدارا در برنامه می دهد . این کتابخانه با نام مستعار OpenAL در سایت OpenAL

قرار دارد و قابل بارگذاری است . همچنین می توانید راهنمای کامل مربوط به استاده از این کتابخانه را نیز در همین سایت بیابید .

 ساختارهای برنامه نویسی

در GL متغیر نداریم ، یعنی در هیچ یک از منابع استاندارد حتی یک متغیر تعریف نشده است ، این بدان معنا نیست که شما نمی توانید از متغیر استفاده کنید بلکه بدان معنی است که خود سیلیکون متغیری در GL تعریف نکرده است .

در GL همواره ثوابت را به شکل زیر و با حروف بزرگ تعریف می کنند: GL_TEXTURE_2D همیشه ثوابت با حروف GL بزرگ شروع می شوند و با یک _ ادامه می یابند سپس نام ثابت و اگر این ثابت اندازه داشته باشد مجدداً _ و مقدار یا مشخصه ثابت قرار می گیرد.

در GL توابع نیز به شکل زیر تعریف می شوند : glVertex3f همیشه توابع با gl کوچک یا اگر از کتابخانه کمکی استفاده شوند glu شروع می شوند در ادامه نام تابع وارد می شود که در اینجا Vertex به معنی نقطه است و در ادامه تعداد یا مشخصه اصلی نام تابع وارد می شود که در اینجا 3 وارد شده و در نهایت نوع مقدار و مشخصه وارد می گردد که در این مثال f به معنی float یا (اعشاری) است .

در Gl تعدادی قابلیت ثابت برای کارتهای گرافیکی مختلف و جود دارد که معمولاً شرکتهای سازنده کارت گرافیکی آنها را اضافه می کنند .

 نحوه استفاده

از این کتابخانه در همه زبانهای برنامه نویسی با قابلیت ساخت برنامه اجرایی یا Application می توان استفاده کرد . در اکثر این زبانها کار با GL به یک شکل است ، به طوری که شما اگر بتوانید در Visual Cpp برنامه مبتنی بر GL بنویسید می توانید همان برنامه را نیز در Visual Basic باز نویسی کنید . مثالهای متنوع از کاربرد GL را در اکثر زبانهای برنامه نویسی می توانید در سایت نئون هلیم بیابید. نحوه استفاده از GL بسیار ساده است که شامل مراحل زیر می شود(ممکن است در بعضی از زبانها این مراحل کمتر یا بیشتر باشد)این مثال برا زبانهای C & Cpp نوشته شده است .

  • فراخوانی منابع GL
 مثال:
 #include 
  • ساخت متغیری برای جایگیری محتویات رندر و تنظیمات پیکسل
 مثال:
 HGLRC hRc=NULL;
 int m_PixelFormat;
  • تنظیمات پیکسل فرمت
 مثال:
 PIXELFORMATDESCRIPTOR pfd
  • تنظیمات در گاه نمایش
 مثال:
 این قسمت از کار باید در مرجع توابع مربوط به اندازه پنجره برنامه انجام گیرد، برای اینکار
 تابع OnSize بسیار مناسب است.
 استفاده از تابع فریم بندی پنجره در GL با نام ViewPort
  • تخریب GL اینکار برای زمانی انجام می گیرد که کاربر برنامه را می بندد ، حالا برنامه باید بتواند کلیه منابعی را که از سیستم در اختیار گرفته بود آزاد سازد . بهترین راه این کار استفاده از توابع wgl است.
  • ترسیم اشیاع در GL ، این بخش رندر نیز محسوب می شود ، زیرا ما تمامی اشیاعی که نمایش می دهیم را در این قسمت رسم می کنیم.

سایت رسمی سیلیکون گرافیک

سایت رسمی OpenGL

سایت رسمی OpenAL

سایت آموزش برنامه نویسی OpenGL