آموزش تخصصی ویژوال بیسیک 6

مسائل مربوط به برنامه نویسی ویژوال بیسیک 6

آموزش تخصصی ویژوال بیسیک 6

مسائل مربوط به برنامه نویسی ویژوال بیسیک 6

آموزش opengl قسمت اول

امروز براتون یه مژده دارم و اونم اینه که امروز در مورد آموزش OpenGL در ویژوال بیسیک آموزش هایی براتون میگزارم.این آموزش جزء آموزش های حرفه ای و پیشرفته به حساب میاد.

از همین اول کار شرط میبندم که از این آموزش لذت میبرین چون با حرفه ای شدن در زمینه OpenGL میتونید برنامه هایی از قبیل برنامه های میکس و افکت گزاری روی تصاویر و ساختن بازی های سه بعدی قدرتمند انجام بدین.

حالا اونایی که در این ضمینه (یعنی کارهای سه بعدی) یه مقدار تجربه دارن این سوال برای اونها پیش بیاد که چرا OpenGl ؟

شما میدونید که DirectX هم میتواند کارهای سه بعدی انجام دهد ولی چرا OpenGL که سخت تر و وقت گیر تر است؟

خوب من به سوالات شما جواب میدم. من به این علت آموزش OpenGL رو میذارم چون :

شاید با بازی قدرتمند Doom آشنایی داشته باشید منظور من از این جمله اینه که بازی Doom با OpenGL برنامه نویسی شده.همچنین OpenGL نسبت به DirectX قدرت بیشتری داره و با سرعتی در حدود ۳ برابر DirectX کار میکنه و مقدار حافظه کمتری اشغال میکنه.

هرچند OpenGL مزایای بسیار زیادی داره ولی تعداد خطوطی که ما باید کد بنویسیم بیشتره و وقت بیشتری صرف نوشتن برنامه با OpenGL میشه.اما این ضرر OpenGL هم قابلیت رفع داره برای رفع این مشکل ما با ساختن یک موتور(Engin) گرافیکی ساده ولی قدرتمند تعداد خطوطی که باید کد بنویسیم نصف و شاید هم کمتر از نصف DirectX بشه.

خوب میریم سراغ آموزش :

به احتمال ۹۸٪ شما کتابخانه( OpenGL (vbogl.tlb رو در داخل کامپیوترتون ندارین اما من این رو از قبل پیش بینی کردم. و لینک دانلود کتابخانه OpenGL رو براتون گذاشتم.

http://home.pacific.net.hk/~edx/bin/vbogl12.zip



بعد از اینکه فایل مورد نظر رو دانلود کردین ویژوال بیسیک رو باز کنین و از منوی Project گزینه Refrences رو بزننین و در پنجره باز شده دکمه فرمان Browse رو بزنین و آدرس فایل vbogl.tlb (همون فایلی که دانلود کردین) رو باز کنین و بعد از انتخاب کردن فایل vbogl.tlb روی دکمه فرمان Open کلیک کنید.

بعد در داخل کادری که لیست DLL های شناسایی شده است به دنبال VB OpenGL API 1.2 بگردین و تیک کنار اون رو فعال کنین.

باریکلا.اگه احیانا مشکلی پیش اومد(خدانکنه) در قسمت نظرات بگو.

برای اینکه کدهایی که ما مینویسیم با استفاده از روتین های OpenGL هست در داخل فرم ما نمایش داده نمیشه و ما برای اینکه کدهایی که مینویسیم اجرا بشه باید تغیراتی در برنامه ایجاد کنیم برای اینکار:در ویژوال بیسیک از منوی Project روی Project Properties کلیک کنید تا جعبه تنظیم خواص پروژه باز بشه.بعد از لیست باز شو Startup Object گزینه Sub Main را انتخاب کنید و OK را بزنید.

حالا میریم سراغ کد نویسی:

از منوی Project گزینه Add Module را بزنید تا برای شما یک ماژول جدید بسازد.بعد خاصیت Name ماجول رو برابر با OpenGLMain قرار دهید.

حالا ما کدهای اصلی که موتور گرافیکی ۳ بعدی ما رو میسازه مینویسیم.

روی ماجول جدید خود دابل کلیک کنید تا پنجره View Code باز بشه.و بعد کدهای زیر رو بنویسید:

()Sub Main

Dim Done As Boolean
Dim frm As Form
Done = False
Set frm = New Form1
If Not CreateGLWindow(frm, 640, 480, 16) Then Done = True

Do While Done = False
If (DrawGLScene = False) Then
Unload frm
Else
( SwapBuffers (frm.hDC

DoEvents
End If
Done = frm.Visible = False
Loop
Set frm = Nothing
End
End Sub


در قطعه کد بالا ابتدا یک متغیر از نوع بولن تعریف میکنیم . تا وقتی که متغیر Done مقدار False داشته باشد برنامه ما ادامه پیدا میکند ولی هر گاه که متغیر Done برابر با True شود برنامه خاتمه پیدا میکند. در خط بعدی ما یک متغیر به نام frm از نوع Form تعریف میکنیم و در خط پنجم نیز متغیر frm را به فرم برنامه مرتبط میکنیم.در خط ششم نیز از یک دستور شرطی استفاده کردیم که هرگاه CreateGLWindow (که در ادامه آن را میسازیم و کار آن ساخت پنجره ای است که اشیا دو بعدی و چند بعدی ما در آن نمایش داده شوند) برابر با مقداری خلاف قوانین ما شد برنامه خاتمه پیدا کند و باعث هنگ کردن سیستم نشود. در ادامه ما باید پنجره نمایش اشیا را که نام آن CreateGLWindow است بسایم. برای این کار کدهای زیر را در ماجول بنویسید:

Public Function CreateGLWindow(frm As Form, Width As Integer, Height As Integer, Bits As Integer) As Boolean
Dim PixelFormat As GLuint
Dim PFD As PIXELFORMATDESCRIPTOR

PFD.cColorBits = Bits
PFD.cDepthBits = 16
PFD.dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER
PFD.iLayerType = PFD_MAIN_PLANE
PFD.iPixelType = PFD_TYPE_RGBA
PFD.nSize = Len(PFD) 'X
PFD.nVersion = 1

PixelFormat = ChoosePixelFormat(frm.hDC, PFD) 'X
If PixelFormat = 0 Then
KillGLWindow
MsgBox "Can't set the:", 16
CreateGLWindow = False
End If

If SetPixelFormat(frm.hDC, PixelFormat, PFD) = 0 Then
KillGLWindow
MsgBox "" 'X
CreateGLWindow = False
End If

( hrc = wglCreateContext(frm.hDC

If hrc = 0 Then
KillGLWindow
MsgBox "Can't rendering Context:", vbExclamation, "ERROR

CreateGLWindow = False
End If

If wglMakeCurrent(frm.hDC, hrc) = 0 Then
KillGLWindow
MsgBox "Can't Active rendering Context:", vbExclamation, "ERROR
CreateGLWindow = False
End If
frm.Show
If Not InitGL() Then
KillGLWindow

MsgBox "Initialize Failed!",vbExclamation,"Error
CreateGLWindow = False
End If

CreateGLWindow = True


End Function


توجه: از نوشتن کلماتی که با رنگ سبز هستند خودداری کنین چون من ویندوزم فارسی نویسی نداره و وقتی که در داخل وبلاگم انگلیسی مینویسم علامت هایی مثل (=+-/.":"/.()) و امثال اینها در جملات جا به جا میشن و موجب گمراهی شما میشن.

انشاالله سورس های آمادشون رو هم براتون میزارم تا مشکلات به ۰٪ برسه.

در داخل روتین بالا دو تابع دیگر به نام های KillGLWindow و InitGL فراخوانی شده اند که ما باید اونها رو در داخل ماجولمون بنویسیم.

کار تابع CreateGLWindow در اصل ساخت Engin (موتور) گرافیکی است و توابع دیگر مانند KillGL و InitGL کارهایی از قبیل خطا زدایی انجام میدهند بنابر این تابع CreateGLWindow مهمترین تابع برنامه ماست چون که موتور گرافیکی ما رو میسازه.

برای نوشتی تابع KillGLWindow کدهای زیر رو به ماجولتون اضافه کنین:

Public Sub KillGLWindow() 'X

If hrc Then
If wglMakeCurrent(0, 0) = 0 Then
MsgBox "Rilase DC and RC Failed.", vbInformation, "ShutDownError" 'X
End If
If wglDeleteContext(hrc) = 0 Then
MsgBox "Failed", vbInformation, "ERROR" 'X
End If
hrc = 0
End If

End Sub


خوب ما تا حالا حدود ۷۰٪ کارا رو انجام دادیم.

حالا باید تابع InitGL رو بنویسیم که کار این تابع پاک کردن صفحه نمایش و آماده سازی آن برای رسم اشکال سه بعدی است.

برای نوشتن تابع InitGL کدهای زیر رو به ماجول برنامتون اضافه کنین:

Public Function InitGL() As Boolean
glClearColor 0.5, 0.5, 1, 0
InitGL = True
End Function


اگه بخواهیم به صورت نگاهی به مساله توجه کنیم شما تا الآن ۹۰٪ کارارو انجام دادین.

برای ادامه کار شما باید یک ماجول دیگه با نام DrawShape بسازین . برای این کار از منوی Project روی منوی Add Module کلیک کنید و خاصیت Name ماجول جدید خود را برابر با DrawShape کنید.

حالا باید تابعی رو بنویسیم که کار رسم اشکال دو بعدی و سه بعدی رو برعهده داره.اسم این تابع DrawGLScene است که برای نوشتن آن کدهای زیر را به ماجول DrawShape اضافه کنین:

Publice Function DrawGLScene() as Boolean

glClear clrcolorbufferbit

DrawGLScene = True

End Function

حالا برنامه ای رو که ساختین اجرا کنین اگه کارها رو درست انجام داده باشین باید رنگ پشت زمینه فرم شما آبی رنگ بشه در غیر این صورت به دنبال اشتباهی که کردین بگردین
نظرات 1 + ارسال نظر
ali سه‌شنبه 30 مرداد‌ماه سال 1386 ساعت 11:22 ق.ظ

من در مود dll مربوط به open Gl مشکل دارم
من وقتی که اون رو تو vb باز میکنم این خطا رو میده
error in loading dll
لطفا یک راه حل به من بدین
ممنون از مطالب خوبتون

این مشکل با برنامه ویژوال توئه یه بار دیگه نصبش کن اگه درست نشد باید ویندوزتو عوض کنی

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد