انجمن تخصصی بازی سازی و گرافیک
آموزش مقدماتی OpenGL - نسخه‌ی قابل چاپ

+- انجمن تخصصی بازی سازی و گرافیک (http://www.forum.khoramsoft.com)
+-- انجمن: برنامه نویسی (/forum-88.html)
+--- انجمن: OpenGl (/forum-14.html)
+---- انجمن: آموزشهای مربوط به OpenGl (/forum-48.html)
+---- موضوع: آموزش مقدماتی OpenGL (/thread-254.html)

صفحه‌ها: 1 2 3


مقدماتی OpenGL - MAJID - 11-19-2011 12:49 PM

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

flag

در ضمن از دوستان عزیز خواهش می کنم از زدن پست های نامربوط مثل تشکر ،سوال و...............خوداری کنند.در صورتی که مطلب مورد رضایتتون بود از دکمه تشکر و اگه با زدن تشکر هم راضی نشدید از دکمه امتیاز به کاربر استفاده کنید.tk


RE: آموز ش مقدماتی OpenGL - MAJID - 11-20-2011 01:40 AM

مبحث رو با یه مطلب تکراری که توی همه سایتها میشه پیداش کرد شروع می کنم .


API گرافيكي چيست؟

API درواقع بين برنامه و سخت‌افزاري كه برنامه روي آن اجرا مي‌شود، نقش يك هماهنگ‌كننده را دارد و مانند پلي ميان سخت‌افزار و نرم‌افزار ارتباط ايجاد‌مي‌كند. يعني برنامه‌نويس كدهايي مي‌نويسد كه داده‌هاي گرافيكي خود را به وسيله دستورهاي استانداردي به درايور API مي‌فرستد نه مستقيماً به خود سخت‌افزار. سپس درايوري كه شركت سازنده سخت‌افزار توليد‌كرده است، اين كداستاندارد توليدشده را به فرمت بومي و ويژه‌اي كه براي آن مدل خاص سخت‌افزار قابل شناسايي است، ترجمه مي‌كند.

OpenGL چیست؟

OpenGL یا open graphic library یک کتابخانه اپن سورس برای کار با گرافیک کامپیوتر است .OpenGL در سال 1992 توسط Silicion Graphics ساخته شد. اوپن جی‌ال بیتشر تمرکز خود را روی موضوعات مهندسی، CAD و علمی گذارده و بهای کمتری به بازیهای کامپیوتری می‌دهد. حال روی کنسول‌ها بیشتر استفاده می‌شود.

در سال 1996، نويسندگان و توسعه‌دهندگان بازي‌هاي كامپيوتري از نسخه ويندوزي OpenGL براي ساخت بازي‌هاي كامپيوتري استفاده كردند. OpenGL براي پشتيباني از گستره وسيعي از تكنيك‌هاي رندركردن گرافيكي پيشرفته طراحي شده است كه مي‌توان پاره‌اي از آن‌ها را به اين‌صورت نام برد:

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

سايه‌سازي نرم: قابليت تحليل افكت‌هاي سايه هنگام تابش نور به يك زاويه و ايجاد اختلا‌ف نور خفيف در مقابل آن سطح (مانند نور كمي كه هنگام تابش آفتاب به يك صخره يخي در اطراف آن ايجاد مي‌شود).

حركت محو ومدل‌سازي: توانايي تغيير مكان و اندازه پرسپكتيو يك شي در فضاي سه بعدي.
مجموعه امكانات OpenGL شبيه Direct3D است. ولي API سطح پايين‌تر آن (نزديك‌تر به سطح سخت‌افزار) باعث مي‌شود كنترل خوبي روي عناصر اصلي ايجاد صحنه‌هاي سه بعدي مانند اطلا‌عات سه‌ضلعي‌ها كه سلول‌هاي تشكيل‌دهنده يك مدل سه بعدي هستند داشته باشد.

OpenGL به صورت اپن‌سورس ارائه شده‌است و سازندگان سخت‌افزار مي‌توانند قابليت‌هاي گوناگوني را برپايه OpenGL در سخت‌افزارهايشان ايجاد كنند. تصميم‌گيري درباره ايجاد تغييرات در OpenGL را كنسرسيوم ARB اتخاذ مي‌كند.
اين كنسرسيوم شامل اعضاي مهمي همچون اپل، اينتل، آي‌بي‌ام، سان، ATI، Dell، nVIDIA، Silicion Graphics و 3Dlabs است و از سوي شركت‌هاي معتبر ديگري مانند متراكس، S3 ،Xi و Quantum 3D حمايت مي‌شود. توسعه‌دهندگان نرم‌افزار براي استفاده از OpenGL در نرم‌افزارهايشان نيازي به اخذ مجوز ندارند. ولي توليدكنندگان سخت‌افزار براي پياده‌سازي سخت‌افزاري OpenGL نيازمند اخذ مجوز از SGI هستند.

چرا از OpenGL استفاده کنیم؟

  1. طراحي و سادگي استفاده از API موجود در Open GL
  2. تولید کد ساده و خوانا
  3. اختصاص ندادن زمان زیاد
  4. D3D سختي زيادي را به برنامه نويسان تحميل مي كند
  5. در بسياري از موارد تنها يك خط از كد GL معادل يك نيم صفحه كد Direct3D مي باشد .
  6. قابلیت حمل بر روی پلت فرم‌های مختلف مانند Linux، Unix، Windows و ...

OpenGL برای رسیدن به دو هدف ارائه شد:

مخفی کردن پیچیدگی های ارتباط با شتابدهنده های سه بعدی ، بوسیله ی ارائه ی APIهایی یکسان و واحد.
مخفی کردن امکانات پلتفرم های سخت افزاری ، بوسیله ی مجموعه ای از امکانات مشخص که همواره می توان اطمینان داشت که پشتیبانی می شوند ( حتی با شبیه سازی نرم افزاری آنها)

فکر کنم تا همین جا برای آشنایی کافی باشد.و در پست بعدی آن شالله سعی می کنم نحوه مقدمات کار با OpenGL رو شرح بدهم تا بتونیم برانامه نویسی با اونو شروع کنیم.flag


RE: آموز ش مقدماتی OpenGL - MAJID - 11-20-2011 11:29 PM

برای کار با OpenGL قبل از هر کاری بایستی کامپایلر رو آماده کنیم .
مبنای آموزش ما کامپایلر Microsoft Visual Studio 2010 در ویندوز 7 و به صورت WIN32 هست .البته برای کار با کامپایلرهای دیگه هم نیاز به تغییر چندانی نیست .ما دور روش رو برای آماده سازی و به کار گیری کتابخانه های اون بیان می کنیم.که دوستانی که به این کامپایلر دسترسی ندارند به مشکل بر نخورند.

ابتدا فایل زیر رو دریافت کنید.

[attachment=589]

فایل رو از حالت فشرده خارج کنید ،فایلهای داخل پوشه dlls needed رو
اگه از ویندوز 64 بیتی استفاده می کنید در مسیر

C:\windows\SysWOW64

و اگه از ویندوز 32 بیتی استفاده می کنید در مسیر

C:\windows\system32

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

فایل های داخل پوشه compiler needs رو هم در مسیرهای زیر کپی کنید

پوشه include

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl

و پوشه lib

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib

کامپایلر ما الان آماده شده است .فقط باید اونو تست کنیم تا مطمئن بشیم بدون مشکل می تونیم کار با Opengl رو شروع کنیم.

به این دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
برید و طبق ارسال شماره 4 یک پروژ WIN32 ایجاد کنید.

حالا کد زیر رو توی API.cpp کپی کنید و اون رو اجرا کنید .در صورتی که همه کارها رو درست انجام داده باشید باید شکل یک مکعب قرمز رو مشاهده کنید.




/* Copyright © Mark J. Kilgard, 1997. */
/* This program is freely distributable without licensing fees 
   and is provided without guarantee or warrantee expressed or 
   implied. This program is -not- in the public domain. */
 
/* This program was requested by Patrick Earl; hopefully someone else
   will write the equivalent Direct3D immediate mode program. */
#include <Windows.h>
#include <GL/glut.h>
 
GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0};  /* Red diffuse light. */
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};  /* Infinite light location. */
GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
  {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
  {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
 
void
drawBox(void)
{
  int i;
 
  for (i = 0; i < 6; i++) {
    glBegin(GL_QUADS);
    glNormal3fv(&n[0]);
    glVertex3fv(&v[faces[0]][0]);
    glVertex3fv(&v[faces[1]][0]);
    glVertex3fv(&v[faces[2]][0]);
    glVertex3fv(&v[faces[3]][0]);
    glEnd();
  }
}
 
void
display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  drawBox();
  glutSwapBuffers();
}
 
void
init(void)
{
  /* Setup cube vertex data. */
  v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
  v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
  v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
  v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
  v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
  v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
 
  /* Enable a single OpenGL light. */
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHTING);
 
  /* Use depth buffering for hidden surface elimination. */
  glEnable(GL_DEPTH_TEST);
 
  /* Setup the view of the cube. */
  glMatrixMode(GL_PROJECTION);
  gluPerspective( /* field of view in degree */ 40.0,
    /* aspect ratio */ 1.0,
    /* Z near */ 1.0, /* Z far */ 10.0);
  glMatrixMode(GL_MODELVIEW);
  gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
    0.0, 0.0, 0.0,	/* center is at (0,0,0) */
    0.0, 1.0, 0.);	/* up is in positive Y direction */
 
  /* Adjust cube position to be asthetic angle. */
  glTranslatef(0.0, 0.0, -1.0);
  glRotatef(60, 1.0, 0.0, 0.0);
  glRotatef(-20, 0.0, 0.0, 1.0);
}
 
int WINAPI WinMain(HINSTANCE hinstance,
		HINSTANCE hPrevInstance,
		LPSTR argv,
		int argc) 
{ 
    glutInit(&argc, &argv); 
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutCreateWindow("red 3D lighted cube");
  glutDisplayFunc(display);
  init();
  glutMainLoop();
  return 0;		 /* ANSI C requires main to return int. */
}


متن مخفی
mm



RE: آموز ش مقدماتی OpenGL - MAJID - 11-22-2011 06:43 PM

در پست قبلی در مورد نحوه به کارگیر کتابخانه های OpenGL در کامپایلر VS2010 صحبت کردیم در این پست می خوام نحوه استفاده از این کتابخانه رو با یه روش دوم رو توضیح بدم که به مراتب بهتر از روش قبلی هست و دردسرها کمتری داره.

در این روش تمام فایل ها پوشه lib و پوشه include رو در داخل پوشه پروژه میریزیم .

برای مثال من در VS2010 یک پروژه WIN32 با نام
opengl ایجاد کردم .فایلهای موجود در پوشه های lib و include رو در مسیر زیر کپی می کنم :

D:\Documents\Visual Studio 2010\Projects\opengl\opengl

نکته ایی که اینجا باید بگن مسیر پیشفرض پروژه های من

D:\Documents\Visual Studio 2010\Projects

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

C:\windows\SysWOW64

و اگه از ویندوز 32 بیتی استفاده می کنید در مسیر

C:\windows\system32

کپی کنید.

نکته :برای برنامه هایی که با OpenGL می نویسید حتماً بایستی همراه فایل EXE فایلهای DLL رو هم همراه پروژه ارائه بدید .

اما برای فراخوانی هدر فایلها و فایلهای کتابخانه ایی باید چکار کنیم؟

برای فایلهای کتابخانه ایی (Lib) از دستور

#pragma comment(lib,"نام کتابخانه")

و هدر فایلها از ذستور

#include "نام هدر فایل"

برای مثال پروژه قبلی رو با این روش اجرا کنید.

/* Copyright © Mark J. Kilgard, 1997. */
 
/* This program is freely distributable without licensing fees 
   and is provided without guarantee or warrantee expressed or 
   implied. This program is -not- in the public domain. */
 
/* This program was requested by Patrick Earl; hopefully someone else
   will write the equivalent Direct3D immediate mode program. */
#include <Windows.h>
#include "glut.h"
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
#pragma comment(lib,"GLAUX.LIB")
GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0};  /* Red diffuse light. */
GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};  /* Infinite light location. */
GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
  {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
  {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
void
drawBox(void)
{
  int i;
 
  for (i = 0; i < 6; i++) {
    glBegin(GL_QUADS);
    glNormal3fv(&n[0]);
    glVertex3fv(&v[faces[0]][0]);
    glVertex3fv(&v[faces[1]][0]);
    glVertex3fv(&v[faces[2]][0]);
    glVertex3fv(&v[faces[3]][0]);
    glEnd();
  }
}
 
void
display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  drawBox();
  glutSwapBuffers();
}
 
void
init(void)
{
  /* Setup cube vertex data. */
  v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
  v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
  v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
  v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
  v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
  v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
 
  /* Enable a single OpenGL light. */
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHTING);
 
  /* Use depth buffering for hidden surface elimination. */
  glEnable(GL_DEPTH_TEST);
 
  /* Setup the view of the cube. */
  glMatrixMode(GL_PROJECTION);
  gluPerspective( /* field of view in degree */ 40.0,
    /* aspect ratio */ 1.0,
    /* Z near */ 1.0, /* Z far */ 10.0);
  glMatrixMode(GL_MODELVIEW);
  gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
    0.0, 0.0, 0.0,    /* center is at (0,0,0) */
    0.0, 1.0, 0.);    /* up is in positive Y direction */
 
  /* Adjust cube position to be asthetic angle. */
  glTranslatef(0.0, 0.0, -1.0);
  glRotatef(60, 1.0, 0.0, 0.0);
  glRotatef(-20, 0.0, 0.0, 1.0);
}
 
int WINAPI WinMain(HINSTANCE hinstance,
	   HINSTANCE hPrevInstance,
	   LPSTR argv,
	   int argc) 
{ 
    glutInit(&argc, &argv); 
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutCreateWindow("red 3D lighted cube");
  glutDisplayFunc(display);
  init();
  glutMainLoop();
  return 0;	    /* ANSI C requires main to return int. */
}

یادمون باشه که این چهار خط همیشه جزء برنامه های ما خواهند بود پس همیشه اونها رو قبل از هر کاری بعد از فراخوانی هدر فایلها قرار بدید.


 #pragma comment(lib,"OPENGL32.LIB")
 #pragma comment(lib,"glut32.lib")
 #pragma comment(lib,"GLU32.LIB")
 #pragma comment(lib,"GLAUX.LIB")
از کتابخانه GLAUX به احتمال زیاد دیگه توی هیچکدوم از پروژه هایی که خواهم داد استفاده نمی کنم بنابراین نیازی نیست حتماً اونو به پروژه اضافه کنید.


RE: آموز ش مقدماتی OpenGL - irancplusplus - 11-23-2011 04:54 AM

سلام
می خوام یه راه ساده تر بگم. من پروژه برنامۀ بالا رو آپلود کردم. ضمیمه یه پروژۀ Win32 داره همراه با همۀ lib ها dll ها و کاربر اصلا نیازی نیست فولدرهای ویندوز یا VS رو تغییر بده. پروژه با Visual C++ 2010 Express باز میشه. فقط یه نکتۀ مهم اینه که توی این پروژه سرفایل های OpenGL رو باید بین " و " قرار بدید نه بین < و >. علتش اینه که سرفایل ها همه کنار پروژه ریخته شدن.
m10

اما قرار دادن dll ها توی فولدرهای ویندوز برنامه نویسیو راحت تر می کنه.


RE: آموز ش مقدماتی OpenGL - MAJID - 11-23-2011 08:04 PM

نقل قول: سلام
می خوام یه راه ساده تر بگم. من پروژه برنامۀ بالا رو آپلود کردم. ضمیمه یه پروژۀ Win32 داره همراه با همۀ lib ها dll ها و کاربر اصلا نیازی نیست فولدرهای ویندوز یا VS رو تغییر بده. پروژه با Visual C++ 2010 Express باز میشه. فقط یه نکتۀ مهم اینه که توی این پروژه سرفایل های OpenGL رو باید بین " و " قرار بدید نه بین < و >. علتش اینه که سرفایل ها همه کنار پروژه ریخته شدن.
[تصویر:  m10.gif]

اما قرار دادن dll ها توی فولدرهای ویندوز برنامه نویسیو راحت تر می کنه.

تنها تفاوتی که روش شما داره اینه که فایلهای DLL رو توی پوشه پروژه ریختید و یه پوشه جدا برای هدر فایل ها ایجاد کردید(GL) (که فقط پوشه پروژه به نوعی مرتب تر و تمیز تره البته واسه پروژه های بزرگ خوبه که بخوایم از کتابخونه های زیادی استفاده کنیم)اما در مورد فایل های DLL ممکنه روی بعضی سیستم ها جواب نده برای اینکار بایستی فایل های DLL رو توی پوشه های Debug و Release قرار بدیم.فایلهای DLL روی اکثر سیستمها وجود دارند علتش هم اینه که هر زمان درایور کارت گرافیک رو نصب می کنم نسخه opengl هم همراهش نصب میشه مثلاً روی سیستم خودم فقط فایل glut.dll وجود نداشت که فکر نکنم کپی کردن یه فایل توی پوشه System مشکلی به وجود بیاره .

در مورد فراخوانی هدر فایل ها هم بالا توضیح دادیم که باید به صورت زیر باشه.

"هدر فایل"
البته شاید برای بعضی دوستان سوال پیش بیاد فرق <> با "" چیه که باید بگم وقتی هدر فایلها بین <> قرار می گیره کامپایلر میره توی پوشه Include کامپایلر دنبال اونها می گرده ولی وقتی بین "" قرار می گیره کامپایلر توی پوشه پروژه دنبال هدر فایلها می گرده.

اگه اشتباهی توی توضیح بود ممنون میشم گوشزد کنید.

tk


RE: آموز ش مقدماتی OpenGL - MAJID - 11-24-2011 12:06 AM

کم کم بریم سراغ خود OpenGL و برنامه نویسی رو شروع کنیم .

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

توابع اصلی OpenGL با gl شروع و در ادامه حرف اول آن با حروف بزرگ نوشته می شود .برای مثال

glClear

glColor

glGetPolygonStipple


توابع glu با glu شروع و در ادامه حرف اول هرکدام از واژه ها به صورت بزرگ نوشته می شود.


gluBuild2DMipmaps

gluNewTess

gluDisk


یا توابع glut با glut شروع و در ادامه حرف اول هرکدام از واژه ها به صورت بزرگ نوشته می شود.


glutInit

glutInitDisplayMode

glutMainLoop



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

علاوه بر توابع در OpenGL ثابتها هم وجود دارند که نحوه نام گذاری آنها به اینصورت است .

در ابتدای آنها GL با حروف بزرگ نوشته می شود و بعد از آن یک "_" (underscore) قرار می گیرد و سپس نام ثابت با حروف بزرگ نوشته می شود.در صورتی که نام یک ثابت از چندین واژه تشکیل شده باشد بعد از هر واژه یک "_" قرار می گیرد.

مثال


GL_LINES

GL_COLOR_BUFFER_BIT


بعضی از توابع OpenGL به اعداد ختم میشن اون اعداد چی هستند؟

glColor3f

glVertex3fv


درواقع اعداد نشان دهنده تعداد آرگومانهای ورودی تابع هستند که ما باید قرار بدیم .

مثلاً در تابع glColor3f عدد 3 نشان دهنده این است که تابع بایستی دارای 3 آرگومان ورودی باشد که نوع آنها Float می باشد اما چرا Float ؟به خاطر حرف f بعد از 3 هست که به ما میگه نوع آرگومانها بایستی از نوع Float باشند.

اما ممکنه به سوال دیگه پیش بیاد اون حرف V واسه چیه؟
جواب این سوال باشه واسه پست بعدی
M25
flag


RE: آموز ش مقدماتی OpenGL - MAJID - 11-29-2011 09:19 PM

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

برای مثال :

glClearColor(0.5,0.5,0.5,1.0);

با

GLfloat Array_Color[] ={0.5,.05,0.5,1.0};
    glVertex3fv (Array_Color);

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

متغیرهای در OpenGL

تعریف متغیرهای در OpenGL مانند تعریف متغیر در زبان ++C می باشد با این تفاوت که OpenGL دارای نوع های مستقل است .چون OpenGL یک API مستقل از پلتفرم هست بنابراین برای اجرا شدن بهتر و بدون درسر برنامه های نوشته شده با آن، دارای نوع های مستقل می باشد.
در جدول زیر همه نوع های OpenGL معرفی شده اند که تقریباً همان نوع های به کار رفته در زبانهای دیگر مثل ++C هستند.

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.


نوع های GLclampf و GLclampfd همان نوع های GLfloat و GLdouble هستند با این تفاوت که به ما می گه که محدوده اعداد از 0.0 تا 1.0 می باشد.

نوع size که مشخص کننده مقدار طول یا عمق میباشد. بطور مثال GLsizei یکی از توابع OpenGL است که نشان دهنده این است که این تابع یک متغیر از نوع صحیح را به عنوان آرگومان میگیرد.



چند مثال:
GLfloat m;//متغیری از نوع Float
GLdouble Array_Depth[10]; // آرایه 10 عنصری از نوع اعشاری Double
GLint *ints_pointers[3]; // آرایه از 3 اشاره گر به متغیرهای صیح int




RE: آموز ش مقدماتی OpenGL - MAJID - 11-30-2011 07:01 PM

با مقدمات اولیه تا اندازه ایی آشنا شدیم امروز می خوایم درباره یه برنامه خیلی ساده بحث کنیم و با بعضی از توابع GL وglut آشنا بشیم.

// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT); // Clear the window 
    glFlush(); // send all output to display
}
 //*** main ***
int WINAPI  WinMain(HINSTANCE hinstance,
		  HINSTANCE hPrevInstance,
		  LPSTR argv,
		  int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
    glutCreateWindow ("khoramsoft"); // Create the window 
    glutDisplayFunc (Display); // Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}

در خط های 1 تا 9 کتابخانه ها و هدر فایل های لازم رو فراخوانی کردیم همونطور که قبلاً هم گفتم این خطوط جزء همیشگی برنامه های ما در این سری آموزش هستند.

در خط 16 ما تابع اصلی mian رو برای برنامه نویسی در محیط win32 نوشتیم.همه برنامه ها در ++C درای این تابع می باشند و برنامه ها از این تابع شروع به اجرا کرده و از طریق این تابع به قسمت های دیگر برنامه هدایت می شوند. اگه می خواید در مورد اون بیشتر بدونید به دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
برید.(16 تا 19 مربوط به تابع main و آرگومانهای آن)

در خط 22 تابع ()glutInit را مقدار دهی کردیم این تابع در برنامه های openGL که از کتابخانه glut استفاده می کند و یک بار مقداردهی اولیه می شود .در واقع این تابع کتابخانه glut رو معرفی می کنه.
شکل کلی آن به صورت زیر است:

void glutInit(int *argcp, char **argv);


این تابع دارای 2 آرگومان هست :

argcp: که اشاره گری به متغیر argc تابع main است . argc تعداد آرگومانهای ارسالی رو ذخیره می کند.
argv: اشاره گری به متغیر argv تابع main است و argv مقدار آرگومانها رو ذخیر ه می کند .
در آینده در مورد این تابع بیشتر بحث خواهیم کرد.



glutCreateWindow ("khoramsoft");

با فراخوانی این تابع پنجره ما ساخته میشه و در titel آن عبارت khoramsoft را قرار می دهد.شکل کلی آن به صورت زیر است.

int glutCreateWindow(char *name);

همانطور که می بینید این تابع یک مقدار int را بر می گرداند که با استفاده از آن به کنترل پنجره های گرافیکی دیگر می پردازیم.
آرگومان این تابع یه مقدار رشته ایی می باشد.


glutDisplayFunc (Display);

این تابع یک تابع دیگه رو فراخوانی می کنه ،که ما نوشتیم در واقع آرگومان اون یک تابع است.به اینگونه توابع CallBack گفته میشه و شکل کلی اون به صورت زیر:

void glutDisplayFunc(void (*func)(void));

تابع بعدی glutMainLoop () هست که باعث شروع رخدادهای glut میشه به محض رسیدن برنامه به این خط تمام تعاریفی که برای ایجاد پنجره کرده ایم رو به کار میندازه و باعث نمایش پنجره ما میشه .این پنجره یک حلقه پردازشی بی نهایت ایجاد می کنه و تا زمان بستن پنجره به کار خودش ادامه میده و بارها و بارها تمام دستوراتی که با glut نوشتیم رو اجرا می کنه این حلقه تمام حرکات مانند موس ،کیبورد رو لحظه به لحظه پردازش و باعث میشه ما تغییرات رو در صفحه مشاهده کنیم.

در تابع Display دوتابع دیگه داریم. این دو تابع از دستورات کتابخانه اصلی OpenGl هستند.

glClear(GL_COLOR_BUFFER_BIT); 

که با استفاده از اون بافر mask رو پاک می کنیم که مقصود از بافر همون حافظه ماست که رنگ نقاط در اون ذخیره میشه و همیشه باید قبل از ترسیم هر چیزی اونها رو پاک کنیم. شکل کلی اون به صورت زیر است:

void glClear(GLbitfield  mask);

آرگومان اون فقط اجازه استفاده از 4 ثابت زیر رو داره

GL_COLOR_BUFFER_BIT
بافر رنگی

 GL_DEPTH_BUFFER_BIT

بافر عمق

GL_ACCUM_BUFFER_BIT

بافر انباره
GL_STENCIL_BUFFER_BIT

بافر استنسیل

با فراخوانی این تابع فقط بافرهایی که در آرگومان اون معرفی شده پاک می شوند و بقیه بافرها همچنان حالت قبلی خود رو حفظ می کنند.

آخرین تابع ما هم تابع ()glFlush هست که باعث اجرای تمام دستورات OpenGL در تابع Display می شود که تا کنون اجرا نشده اند همونطور که می بینید ما در تابع Display فقط یک دستور داریم .
شکل کلی این دستور به صورت زیر است:

void glFlush(void);



RE: آموز ش مقدماتی OpenGL - MAJID - 12-01-2011 01:51 PM

امروز می خوایم 4 تابع دیگه رو بهتون معرفی کنیم که به ما کمک می کنند پنجره ایی که در درس قبلی ایجاد کردیم رو بیشتر کنترل کنیم.
// Includes Header Files
#include <windows.h>
#include "GL.H"
#include "GLU.H"
#include "glut.h"
// Include Library Files
#pragma comment(lib,"OPENGL32.LIB")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"GLU32.LIB")
void Display(void)
{
    glClearColor(0.5,0.5,0.5,1.0);
    glClear(GL_COLOR_BUFFER_BIT); // Clear the window 
    glFlush(); // send all output to display
}
 //*** main ***
int WINAPI  WinMain(HINSTANCE hinstance,
		HINSTANCE hPrevInstance,
		LPSTR argv,
		int argc) 
{ 
    glutInit(&argc, &argv);  // initialize the toolkit
glutInitDisplayMode(GLUT_SINGLE,GLUT_RGB);
    glutInitWindowSize(600,400);
    glutInitWindowPosition(150,180);
    glutCreateWindow ("khoramsoft"); // Create the window 
    glutDisplayFunc (Display); // Register the "display" function 
    glutMainLoop (); // Enter the OpenGL main loop 
}
 

اولین تابع اضافه شده ما در خط 12 قرار دارد.

glClearColor(0.5,0.5,0.5,1.0);

کار این تابع اینه که رنگ پاک کننده صفحه را با مقادیر داده شده در Mode رنگی RGBA تنظیم می کند.شکا کلی تابع به صورت زیر می باشد.

void glClearColor(GLclampf  red,  GLclampf  green,  GLclampf  blue,  GLclampf  alpha);

آرگومانهای این تابع از نوع GLclampf می باشند که اگه پست های قبلی رو مطالعه کرده باشید میدونید که مقدار آنها در محدوده 0. تا 1.0 می باشد.با تغییر هریک از سه متغیر red,green,blue می توانیم رنگهای زیادی رو به وجود بیاریم .متغیر چهارم alpha یا همان مقدار شفافیت می باشد.

اما چطور مقدار رنگها رو پیدا کنیم؟
راه های زیادی وجود داره که من یه راه ساده رو معرفی می کنم . ما می تونیم Paint ویندوز رو باز کنیم و قسمت پالت رنگ روی Edit Color کلیک کنید در پنجره باز شده رنگ مورد نظر رو انتخاب کنید .من رنگ خاکستری رو انتخاب کردم .

دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
در قسمت مشخص شده می بینید که اعداد هر یک از رنگها نشان داده شده ولی در محدوده 0 تا 255 برای تبدیل اونها به اعداد در محدوده 0.0 تا 1.0 کافیه اونا رو بر 256 تقسیم کنیم.
128/256=0.5


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

تابع بعدی تابع

glutInitDisplayMode(GLUT_SINGLE,GLUT_RGB);

که در خط 24 اضافه شده با استفاده از این تابع mode نمایشی رو برای ما مشخص می کنه و در مثال بالا mode پنجره تک بافری در mode رنگی RGB رو مشخص کرده است .شکل کلی تابع به صورت زیر است .

 void glutInitDisplayMode (unsigned int mode);   

آرگومانهای آن می تواند هر یک از مقادیر زیر باشد.

GLUT_RGBA 
GLUT_RGB   
GLUT_INDEX   
GLUT_SINGLE    
GLUT_DOUBLE    
GLUT_ACCUM    
GLUT_ALPHA
GLUT_DEPTH
GLUT_STENCIL
GLUT_MULTISAMPLE
GLUT_STEREO
GLUT_LUMINANCE
​



تابع بعدی که در خط 25 آورده شده همونطور که از اسمش پیداست اندازه پنجره رو می تونیم با اون کنترل کنیم.

glutInitWindowSize(600,400);

که در این مثال عرض رو 600 و ارتفاع اون رو 400 پیکسل در نظر گرفتیم .شکل کلی تابع به صورت زیر است:

void glutInitWindowSize(int width, int height);

تابع آخر تابع glutInitWindowPosition است که برای تعیین مکان پنجره ایجاد شده مورد استفاده قرار می گیرد.

شکل کلی آن به صورت زیر است :

void glutInitWindowPosition(int x, int y);

درواقع این تابع موقعیت پنجره رو از بالا ،سمت چپ بر حسب پیکسل تغییر میدهد .مقدار پیشفرض آن 300*300 می باشد.

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