مقدمه آموزش opengl با c++
در دنیای امروز، برنامهنویسی برای عموم، با خروجیهای متنی و حل محاسبات پیچیده کمتر سروکار دارد و بیشتر مشتاق یک خروجی گرافیکی و قابلمشاهده بهصورت فیلم و تصاویر سه بعدی است. در همه رشتههای مهندسی و علمی که با طراحیهای گرافیکی سروکار دارند و از قابلیتهای گرافیکی کامپیوترها استفاده میکنند تا گرافیکهای دو بعدی و سه بعدی تولید کنند، مهمترین هدف تولید خروجیهایی باکیفیت مطلوب و سرعتبالا است.آموزش opengl با c++ هم برای پاسخ به این خواسته و در جهت بهبود این امر مطرحشده است.
با رونق اینترنت و گوشیهای اندروید و هوشمند، بازار رقابت بازیهای کامپیوتری هم داغ شده است به همین جهت نیاز به ابزارهای ساخت آنها هم بیشازپیش احساس میشود، ابزارهایی که بتوانند فضای سه بعدی و دوبعدی را به تصویر بکشند و فضایی واقعی را ایجاد کنند.
opengl چیست؟
opengl مخفف Open Source Graphic Library به معنای کتابخانه گرافیکی متنباز میباشد که توسط شرکت آمریکایی Silicon Graphic ارائهشده است. opengl یک کتابخانه رایج برای تولید و کد نویسی نرمافزارهای گرافیکی است، بیشترین کاربرد آن در ساخت بازیهای کامپیوتری میباشد.
باگذشت زمان، رفتهرفته برنامهنویسی جنبه گرافیکی به خود گرفته است و خروجی اکثر دستورات برنامهنویسی در زبانهای مختلف بهصورت گرافیکی و انیمیشن میباشد. در برنامهنویسی مدرن، امکاناتی مانند حجم دادن به اشیاء، حرکت کنترلشده در تمامی جهتها با مختصات گوناگون، ایجاد نور و روشنایی و غیره وجود دارد.
پیشنیاز آموزش opengl با c++ این است که درزمینه برنامهنویسی گرافیکی مهارت داشته باشید. این کتابخانه برای زبانهای مختلفی مثل c#، جاوا، پایتون و غیرهقابل استفاده است که ما در پست آموزش opengl با c++ این کتابخانه را در c++ بررسی میکنیم. یکی از مزایای بسیار مهم opengl این است که به برنامهنویسی گرافیکی سرعت و کیفیت بالایی میدهد. در حالت عادی برنامهنویسی گرافیکی سرعت و کیفیت قابل قبولی ندارد. این کتابخانه بدون هیچ مشکلی و بسیار ساده و آسان روی سیستم عاملهای مختلف نصب میشود. در لینک زیر فایل آماده برنامه نویسی open GL با سی پلاس پلاس طراحی و آماده شده که میتوانید مطالعه کنید.
برای اجرای برنامه های opengL با استفاده از c++، به فایلها و کتابخانههای هدر opengl نیاز دارید که برخی از کتابخانههای رایج opengl عبارت اند از:
۱. Core OpenGL (GL): این کتابخانه صدها تابع دارد که پیشوند آنها با “gl” است مثل: glColor، glVertex، glTranslate، glRotat. کتابخانه Core OpenGL یک شئ را از طریق مجموعهای از موارد اولیه هندسی مانند نقطه، خط و چندضلعی مدل میکند.
۲. Open Utility Library (GLU): این کتابخانه بر روی هسته OpenGL برای ارائه ابزارهای مهم و مدلهای ساختمانی بیشتر (مانند سطوح qradric) ساختهشده است. توابع GLU با پیشوند “glu” شروع میشوند مثل: gluLookAt، gluPerspective
۳. OpenGL Utility Toolkit (GLUT): این کتابخانه پشتیبانی برای تعامل با سیستمعامل (مانند ایجاد پنجره، کنترل کلید و ورودیهای ماوس) و مدلهای ساختمانی بیشتر (مانند کره و چنبره) را فراهم میکند. توابع GLUT با پیشوند “شلو” شروع میشوند مثل: glutCreatewindow، glutMouseFunc.
هریک از کتابخانههای فوق، عملکرد کتابخانه ماقبل خود را تکمیل میکنند که درنهایت کتابخانه GLEW کاملترین آنها به شمار میرود و حاوی تمام ابزارهای موردنیاز opengl است. این کتابخانه همراه با opengl کارهای اصلی از قبیل: ایجاد چندضلعیها و textureها، تبدیل مختصات به یکدیگر برای نمایش حرکت، تولید خطاهای opengl و غیره را انجام میدهد.
۴. OpenGL Extension Wrangler Library (GLEW) : کتابخانه GLEW مکانیسمهای زمان اجرای کارآمدی را برای تعیین اینکه کدامیک از افزونههای OpenGL در پلتفرم هدف پشتیبانی میشود را ارائه میدهد.
روش نصب کتابخانه های opengl
معمولاً هر کارت گرافیکی نسخهای از opengl را پشتیبانی میکند و درایوهای کارتهای گرافیکی شامل جدیدترین نسخههای opengl میباشند.
در مرحله اول فایل glut را دانلود میکنیم که این فایل خود شامل سه فایل دیگر به نامهای glut.h, glut32.lib, glut32.dll میباشد. همانطوریکه در شکل فوق مشاهده میکنید، فایلهای موجود در glut را در آدرسهای ذکرشده کپی میکنیم. مراحل فوق برای نصب کتابخانههای opengl در vs.c++ 2010 میباشد، برای نصب opengl در ورژنهای پایینتر از ۲۰۱۰ بهجای کپی در محلهای ۱ و ۲ ،glut32.lib را در آدرس C:\Program Files\Microsoft Visual Studio\VC\lib و glut.h را در آدرس C:\Program Files\Microsoft Visual Studio\VC\include کپی میکنیم.
آموزش برنامه نویسی opengl با c++
برای اینکه بتوانیم یک تصویر یا گرافیک را نمایش دهیم باید خصوصیات هندسی آن را بررسی کرده و مشخص کنیم مثل مختصات رأسها، اتصالات بین رئوس، وجهها و رنگها و غیره. این مشخصات بهصورت راستگرد در جهت حرکت عقربههای ساعت اعمال میشوند.
در opengl نام توابع کتابخانهای با پیشوند gl شروعشده و حرف اول آنهم بهصورت حرف بزرگ نوشته میشود مثل تابع glBegin. همانند سایر توابع بهکار رفته در زبانهای مختلف برنامهنویسی این توابع هم دارای پارامترهایی هستند اما به این پارامترها ثابت نمادین گفته میشود.
پارامترهای ثابت نمادین سه جمله بهصورت سری میباشند که به تابعها فرستادهشده و وظیفه خاص مختص به خودشان را انجام میدهند. ثابتهای نمادین با حروف بزرگ نشان داده میشوند مثل: GL_2D, GL_POLYGON.
داده ها در opengl با c++
برای اینکه نوع دادهها در تمامی سیستمها قابل پشتیبانی باشند، آنها را بهصورت زیر تعریف میکنند یعنی به ابتدای نوع داده GL اضافه میشود. چهار کتابخانه دیگر که در قسمتهای قبل معرفی شدند با کتابخانه اصلی opengl پیوند خوردهاند تا امکانات بیشتری را ارائه داده و از سیستمهای گوناگون زیادی حمایت کنند. مثلاً نوع کتابخانههای ویندوز و اپل از هم جداست.
[LEFT] GLbyte GLshort GLint GLfloat GLdouble GLboolean [/LEFT]
فایل های شاخص در آموزش opengl با c++
به فضاهایی که دارای نام بوده و توابع مربوط به کتابخانهها در آنها قرار دارند، فایلهای شاخص گفته میشود. در زبان c++ با بهکار بردن فایلهای شاخص میتوان از توابع مربوط به کتابخانههای GL, GLU, GLUT, GLEW استفاده کرد. در زیر مثالی از کد نویسی آوردهایم که کتابخانههای مختلف را برای opengl و GLU به هم پیوند میزند.
[LEFT] #include<windows.h> #include<GL/gl.h> #include<GL/glu.h> #include<GL/glut.h> [/LEFT]
البته باوجود کتابخانههای GLUT و GLEW دیگر نیازی نیست که از کتابخانههای GL و GLU استفاده کنیم چراکه GLUT و GLEW امکانات موجود در آنها را نیز پوشش میدهند. نکته دیگر اینکه بعضی از کامپایلرها پسوند .h را پشتیبانی نمیکنند و پیغام خطا ظاهر میشود، در اینگونه موارد پسوند .h را حذف میکنیم.
اجرای برنامه opengl در c++
برای اجرای برنامههای opengl در c++ مراحل زیر پیموده میشود.
با اجرای این مراحل برنامه اجراشده و نتیجه در خروجی و صفحه مانیتور نمایش داده میشود. در لینک زیر پروژه ساعت دیواری openGL را مشاهده خواهید کرد.
قالب کلی برنامههای opengl در زبان برنامهنویسی c++ بهصورت زیر است.
#include<GL/glut.h> . . . تعریف متغیرها و ثابت ها Void init() { مقداردهی اولیه } //تعریف سایر توابع در صورت نیاز init main(int argc,char**argv) { //فراخوانی توابع رسم و ارسال پارامتر ورودی به توابع Init(); glutMainLoop(); return0; }
دستورات opengl در c++
در این قسمت از آموزش opengl با c++ به معرفی برخی از دستورات مهم استفادهشده در opengl میپردازیم.
- glEnable(GLenum cap): برای فعال کردن یک قابلیت در opengl از این دستور استفاده میشود.
- glDisable(GLenum cap): برای غیرفعال کردن یک قابلیت در opengl استفاده میشود.
- gLIsEnabled(GLenum cap): این تابع بررسی میکند که آیا قابلیت موردنظر فعال است یا نه، اگر فعال باشد مقدار GL_TRUE و اگر غیرفعال باشد مقدار GL_FALSE را در خروجی نشان میدهد.
- glut Init(int*argc, char**argv): این تابع از کتابخانه glut در برنامهنویسی opengl استفاده میکند، یک بار مقداردهی اولیه میشود و درواقع کتابخانه glut را معرفی میکند. این تابع متشکل از دو آرگومان argc و argv است که argc تعداد آرگومانهای ارسالی را ذخیره کرده و به متغیر argc تابع main اشاره میکند. argv هممقدار آرگومانها را ذخیره کرده و به متغیر argv تابع main اشاره میکند.
- glClearColor(R,G,B,A): رنگ پیشفرض صفحه (۰,۰,۰,۰) یا همان سیاه است. این تابع رنگ صفحه را به مقادیر RGBA تغییر میدهد که R رنگ قرمز، G رنگ سبز، B رنگ آبی و A میزان شفافیت را تنظیم میکند.
- glClear(GLbitfield mask): از آنجاییکه مقدار رنگ هر پیکسل در بافر قرار داده میشود، بافر باید قبل از رسم چیزی در صفحه پاک شود که این دستور منجربه پاک شدن بافر میشود.
- glBegin(GLenum mode): وقتی میخواهیم رسم یک شکل را شروع کنیم از این دستور استفاده میکنیم که بعدازآن هم مشخصات رأسهای شکل موردنظر را وارد میکنیم. آرگومان GLenum mode نوع شکلی را که میخواهیم رسم کنیم را مشخص میکند.
- ()glEnd: این دستور برای این است که به ما اطلاع دهد رسم شکل موردنظر بهپایان رسیده است.
- {V}{d,f,l,s}glVertex{2,3,4}: این تابع یک رأس از شکلی که باید بین glBegin و glEnd رسم شود را میسازد. در opengl همه شکلها را با مجموع رأسهایشان نشان میدهند البته این نکته را باید در نظر بگیرید که ترتیب رئوس بسیار مهم هستند.
- glutInitWindowPosition(int x,int y): از این تابع برای مشخص کردن موقعیت پنجره استفاده میشود که دارای دو آرگومان طول و عرض است.
- glutCreateWindowSize(int width, int heigih): از این تابع برای مشخص کردن اندازه پنجره استفاده میشود که دارای دو آرگومان طول و عرض است.
- glutCreateWindow(“Test Windows”): وقتی این تابع فراخوانی میشود پنجره ما با عنوان Test Windows ساخته میشود.
- ()glutMainLoop: این تابع باعث میشود تمام رخدادهای glut شروع به اجرا کرده و با رسیدن به این دستور همه تعاریفی که برای ساخت پنجره نوشتهایم کارکرده و پنجره موردنظر ما نمایش داده شود.
رسم اشکال سه بعدی در openGL
رسم اشکال سه بعدی در مبحث آموزش opengl در زبان c++ همانطوریکه در شکل زیر مشاهده میکنید، بسیار ساده و آسان است، به همین دلیل برای برنامهنویسان لذتبخش است. دستورات مربوط به سه شکل رایج حجمی در زیر آورده شده است.
دستور ۱، برای رسم یک مکعب بهصورت هموار، دستور ۲ برای رسم یک مخروط بهصورت هموار و دستور ۳ برای رسم یک مخروط به شکل هموار بهکار برده میشوند.
مثال برنامه نویسی با opengl در c++
در بخش پایانی آموزش opengl با c++ میخواهیم چند مثال از کد نویسی opengl با c++ ارائه دهیم.
کد نویسی رسم خط با opengl در c++
این مثال برنامهنویسی مربوط به رسم یک خط ساده در صفحه نشان میدهد.
#include<gl/glut.h> void init() { glClearColor(0,0,0); glMatrixMode(GL_PROJECTION); ghuOrtho2D(0,100,0,200); } void display() { glClear(GL_COLOR_BUFFER_BIT); glcolor3f(1.0,0.0,0.0); glBegin(GL_LINES); glVertex2i(30,100); glVertex2i(50,10); glEnd(); glFlush(); } int main(int argc,char **argv) { glutInit(&argc.argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutCreateWindowPosition(200,200); glutCreateWindow("Line"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
خروجی این برنامه بهصورت زیر است و نکته قابلتوجه در آن این است که عرض خط را میتوان با استفاده از تابع glLineWidth(glfloat linewidth) تعیین کرد.
کد نویسی رسم مثلث با opengl در c++
این مثال مربوط بهرسم یک مثلث با طیف رنگی میباشد.
#include <GL_glut.h> void Init(void) { glClearColor(1.0,1.0,1.0,0.0); }; void display() { glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glRotatef(0,0.0,0.0,1.0); glBegin(GL_POLYGON); glcolor3f(1.0,0.0,0.0); glVertex2f(-0.5,-0.5); glColor3f(0.0,1.0,0.0); glVertex2f(0.5,-0.5); glColor3f(0.0,0.0,1.0); glVertex2f(0.0,0.5); glEnd(); glPopMatrix(); glutSwapBuffers(); } int main(int argc, char **argv) {glutInit(&argc,argv); gluyInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSizw(400,400); glutCreateWindow("Gradiant Tringle"); Init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
خروجی برنامه فوق بهصورت یک مثلث در وسط صفحه با طیف رنگی بهصورت زیر است.
کد نویسی رسم کره با opengl در c++
در این قسمت میخواهیم کمی حرفهایتر عمل کنیم و یک کره را در وسط صفحه رسم کنیم که نوری به رنگ سفید ازیکطرف آن تابیده میشود.
علاوهبرآن بهمرور زمان مکان و رنگ نور هم تغییر میکند.
#include<gl/glut.h> GLfloat A[4]={1,1,1,}; GLfloat Pos1[4]={9,5,1,0}; GLfloat D=0; int i=0; int j=1; int k=0; int cheaker=0; void init() { glClearColor(0,0,0,0); glShadModel(GL_SMOOTH); glLightfv(GL_LIGHT0,GL_DIFFUSE,A); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); } void display() { glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT); glColor3f(0,1,0); glEnable(GL_LIGHT0); glutSolidSphere(0.4,100,100); glPushMatrix(); glRotatef(D,i,j,k); glLightfv(GL_LIGHT0,GL_POSITION,Pos1); glPopMatrix(); glutSwapBuffers(); D+=.3; A[1]-=.001; glLightfv(GL_LIGHT0,GL_DIFFUSE,A); } void main (int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("kore noor rang"); init(); glutDisplayFunc(display); glutIdleFunc(display); glutMainLoop(); }
خروجی برنامه فوق همانطوریکه مشاهده میکنید بهصورت یک کره در وسط صفحه است.
سه مثال فوق در جهت تکمیل مبحث آموزش opengl با c++ آورده شدهاند.
سخن پایانی در مورد آموزش opengl با c++
در این پست با آموزش opengl با c++ در خدمت شما عزیزان بودیم. مطمئناً در بین شما کسانی هستند که به بازیهای رایانهای و محیطهای گرافیکی علاقهمند بوده و قصد دارند بهطور جدی این مسیر را دنبال کنند. آموزش opengl با c++ میتواند بهعنوان نقطه شروع و راهی ساده برای ورود به حوزه برنامهنویسی گرافیکی باشد. این سبک از برنامهنویسی پیشرو در تولید گرافیکهای دو بعدی و سه بعدی و شبیهسازها باکیفیت و سرعتبالا میباشد.
همانطوریکه دیدید این سبک برنامهنویسی امکانات بیشماری دارد که کار شما را آسان کرده و نیازهای شما در این زمینه را برآورده میسازد فقط کافیست با دستورات و کتابخانهها و توابع آن آشنا شده و آنها را بهصورت عملی بهکار ببرید. امیدواریم آموزش opengl با c++ توانسته باشد در جهت یاری به شما عزیزان قدمی برداشته باشد.
3 پاسخ
لینک دانلود کجاست
سلام لینک دانلود glutخراب است
سلام بله ممنون از اطلاع رسانی تون. لینک دانلود اصلاح شد.
با سلام و خسته نباشید. من طبق مراحلی که گفتید پیش رفتم و فایل های glut رو در مسیرهای زیر کپی کردم؛
فایل glut32.lib در مسیر C:\Program Files(x86)\Microsoft SDKs\Windows\v7.0a\lib
فایل glut.h در مسیر C:\Program Files(x86)\Microsoft SDKs\Windows\v7.0a\Include\gl
فایل glut32.dll در مسیر C:\Windows\SysWOW64 سیستم من ۶۴ بیتی هستش
ولی خطای glut no such file or directory داده میشه. لطفاً راهنماییم کنید. با تشکر