الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Opengl 3.0 و مشتملاته الآن بين يديك

بدأه basha2002 في 12 أغسطس 2008 · 34 رد · 12,593 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#26

شكرا اخي العزيز

الشمري

انا اليوم صرت خبير بحث والحمد لله

صراحة الامر غريب جدا كنت اري الموضوع المثبت هذا من زمان

ولكن ولامرة تجاوزت الصفحة الثانية للموضوع لاني كنت اظنه يتكلم عن اختلافات ما بين

opengl

end

d3d

لكن اليوم وعلي غير العادة قررت اكمل الموضوع وبصراحة انصدمت بردود الاخوة

والصدمة الاكبر ان

opengl 3.0 /3.1

تعتبر نقلة كاملة ونوعية

وتوقفت تمام عن كل ماله علاقة بدروس

open gl 1.0/......

وبدات البحث في المنتديات والمواقع

وسالحص كل ما وجدته وارجو التصحيح لاي من معلوماتي

اولا

النسخة الجديدة هي نقلة نوعية باتم معني الكلمة

ثانيا

هنالك دعم للوافد الجديد من اغلب كروت العرض الجديدة خصوصا

انفديا

ثالثا

بعض الاشخاص صارو يقارنون الوافد الجديد بما يحمله من تعديلات ب

d3d v10

رابعا

علي من يريد التمتع بكامل ميزات الوافد الجديد اقتناء كرت جرافيكس داعم له

مثلا انفديا توجد نسخة غير ثابتة تحتوي علي

sdk

يدعم

opengl 3.0

خامسا

توجد مكتبة تسمي

GL3/gl3.h

تحتوي علي الدوال الجديدة جربتها مع

code::block

ولم تنجح ختي في التعرف علي المكتبة رغم اني عرفتها جيدا

سادسا

جربت بعض الامثلة النادرة جدا للوافد الجديد لكن يضهر خطا يقول لي

انا كارت الشاشة لدي لايدعم خاصية معينة في التطبيق الذي اريد تشغيله

سابعا

جميع الاكواد في شروحتها المقتظبة تركز علي مفهوم

OpenGL Vertex Buffer Objects

ثامنا

دوال الرسم السابقة والتي كانت تعتبر من الرفاهيات صار الان لازم تعرفها لوحدك

تاسعا

الامر الجد هام في هذا الامر كذالك هو

opengl Extension

والذي هو ببساطة امكانية اظافة خواص متقدمة للمكتبة من خلال تعريفات خاصة بمشغلات كارت الجرافيكس

ويوجد في المنتدي في الصفحة السادسة والاخيرة الموضوع الاول وهو يشرح الامر بسهولة وقد افادني جدا

وهذا الامر جد هام لمن اراد الاستفادة من المكتبة وكارت الجرافيكس

اذا ما اراد الاستغناء عن

sdk

الخاص بالكرت

طبعا هذا للخبراء

وفي الاخير وبعد كل هذا الامر والتعب الشديد وجدت مكتبتين

تقومان باستغلال ال

Extension

الجديدة وانشاء دوال للاستفادة منها

وهما

GLEE

والاخرى هي

GLWE

وهما تمام والحمد لله

لكن مزال هنالك نقص في

موارد التعليم

الكتب و الشروحات

الا ما خلى المنتديات طبعا

وهي فرصة لنا لكي نبدا مع المنتج ونقوم بتقيمه وبدراسته جيدا

والاستفادة منه

وانا عزمت علي التوجه للوافد الجديد وذالك لسبب وحيد جدا اني مزلت مبتدا في

opengl

وصلت تقريبا

الي مرحلة التحكم بالكميرا وانشاء مشاهد ثلاثية الابعاد

وانا عارف انها قد تكلف بعض الوقت لكن هذا افضل

نسيت ملاحظتين

الاولي

باقي النسخ تكون مدعومة يعني برنامج من زمن

opengl 1.0

يمشي مع توفر مكاتب الربط طبعا

الثاني

وهي ملاحظة صدمت بها جدا

لاني كنت ابحث عن المكاتب في موقع الرسمي ل

opengl

ولم اجد شيئا

وقد اثار الامر استغرابي لكن بعد بخث توصلت الي مايلي

ان شركة

opengl

ليست مسؤلة عن تقديم مكاتب التي من شكل

(*.h)

بل انها تقدم واجهة يستطيع المبرمج من خلالها الوصول الي العتاد

كما تقدم له الدعم من خلال اظافة

Extension

وكذالك تحفيز الشركات علي دعم المنتوج الجديد

واي شخص عنده معلومات يريت ينورنا بها

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#27

ماقلته أخي صحيح بشكل عام , ولكن هناك بعض التعليقات :

اقتباس
OpenGL Vertex Buffer Objects

هذه موجودة من زمان ( لا أذكر بالظبط في أي نسخة ظهرت ) , ولا أعرف اذا كان تم تحسينها في هذا الاصدار ....

أيضاً :

اقتباس
وفي الاخير وبعد كل هذا الامر والتعب الشديد وجدت مكتبتين

تقومان باستغلال ال

Extension

الجديدة وانشاء دوال للاستفادة منها

وهما

GLEE

والاخرى هي

GLWE

وهما تمام والحمد لله

هذه تسهّل علينا استيراد الامتدادات ( الامتداد ماهو الا عبارة عن دالة موجودة في ملف DLL , يعني مؤشر إلى دالة ) , وكل الاخوان المتعمّقين في السي , يعرفون بشاعة Syntax الخاص بؤشر إلى دالة , لذلك هذه المكتبات ظهرت من أيام OpenGL 1.2 ) لتسهل علينا عملية تعريف هذه الدوال .

لذلك لا علاقة بين Glee مثلا , و GL 3.0 .

الخلاصة :

OpenGL 3.0/3.1 لم تضيف الكثير ( أضافت أمور لا أفهمها ) .. ولكن لا تعتبر نقله حسب كلام الخبراء , هي ركزت فقط على اعادة تقييم المكتبة , فقامت بالاستغناء عن عشرات الدوال القديمة التي غطاها غبار الثمانينات والتسعينات , لتسهّل على مطوّري الشركات ( مثل انفيديا ) , دعم OpenGL .

لذلك الاصدار OpenGL 3.0/3.1 أشبه بما يكون تنظيمي أكثر منه , تقديم شيء جديد .

كما قلت , الكتاب الأحمر هو الذي سيعطي وصفة صحيحة لوضع3.1 OpenGL ( كيف تتعلّمها ) ... تستطيع البدء في تعلّم لغة التظليل GLSL , ستفيدك كثيراُ ... من ناحيتي , أتمنّى تعلمها أيضا , ولكن الاهتمام حاليا منصب على برمجة الألعاب وليس برمجة الرسوميات .

تم تعديل هذه المشاركة بواسطة الشمري في 24 يونيو 2009 في 23:05

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#28

السلام عليكم

مشكور اخي الشمري

والحمد لله كل ما اشارك في موضوع او رد في المنتدي احس باني استفيد اكثر واكثر

و عندي بعض التساؤلات وهي كتالي

اولا

من خلال بحثي علي اكواد لل

opengl 3.0

وجدت درس في موقع الشهير لل

nehe

و قد وضع مثال بسي بلس بلس

وباستخدام

oop

والصراحة لم افهم منه الا القليل لاتي لم اتعمق في

oop

كثير لكن اعرف الاساسيات

المهم

الذي لفت نظري في الكود هو اعتماده علي مفهوم جديد علي هو

Context Creation

وهذا نص كلامه كتالي

اقتباس

Context Creation

We just need to create an OpenGL 3.0 context now and

we're done with setting up the window.

To create a GL 3.0 Rendering Context we have to use the method "wglCreateContextAttribsARB"

which is part of the wgl (pronounced "wiggle") methods which are there to use GL on a Windows

OS (this is glx on Linux/Unix and agl on Mac OS). ARB is short for Architectural Review Board

and means this extension has been added lately. Methods with the "ARB"-suffix require to be

located (as they don't exist in old installs/with old drivers or on old hardware) and to do

this we need an OpenGL context.

wglCreateContextAttribsARB

وذالك جزئية اخرى وهي من القليل الذي فهمته

انه يجب ربط

المكتبة مع الوندوز المنشئة

يعني لم اعرف هل هو هنا يقصد طريقة جديدة ام هي الطريقة عادي التي نتبعاه من قبل

لان الظاهر الامور غير واضخة لدي

لاني بصراحة لم اتعامل مع

window api

لكن كنت استعمل

glut

لانها بسيطة

فيريت احد الاخوة يشرحنا هذه الامور

ولكم الشكر الجزيل

وهذا رابط الدرس

هنا

بصراحة لم افهم الطريقة ولا كيفية استعمال الدالة

تم تعديل هذه المشاركة بواسطة aziz nor في 25 يونيو 2009 في 19:06

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#29

في Windows حتى ننشئ المكتبة OpenGL ( يسمّى OpenGL Context ) ونربطه مع النافذة نحتاج إلى Win32 API التي قام بتطويرها مبرمجو Microsoft .. ولكن Win32 API طويلة ولاتعمل الا على الويندوز .. في Linux يوجد طريقة أخرى تستخدم مكتبة اسمها GLX على ما أظن !! .

لذلك ظهرت GLut وغيرها .. تقوم بتغليف أوامر Win32 API و GLX و أوامر نظام Mac .. حتى تعفيك عن كتابتة التفاصيل .. راجع المواضيع المثبتة .. يوجد درس حول ربط Win32 API مع OpenGL .

عموما .. نعود .. OpenGL Context ( هو عبارة عن ذاكرة تحوي على معلومات عن حالة OpenGL , مثل اللون الحالي - الاكساء الحالي .. الخ )

http://petewarden.com/notes/archives/2005/...pengl_cont.html

في السابق كنا ننشئه باستخدام الدالة wglCreateContext المدعومة من الويندوز بالكامل .

الان في OpenGL 3.0 , تغيّرت المكتبة ولم تتوافق مع الاصدارات السابقة , لذلك وضعوا دالة جديد لعمل Context : wglCreateContextAttribsARB

الدالة لن تجدها الا في كروت العرض التي تدعم OpenGL 3.0 على الأقل .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#30

شكرا اخي الشمري

النقطة الاولي الخاصة بي

ربط النوافذ ان فاهمها والحمد لله

لكن الظاهر اني تلخبطت قليلا

وكذالك كل الامثلة التي اكتبها واتابعها هي مكتوبة ب

glut

الامر الثاني

اذا كان ممكن تعطيني مثال حول كيفية استعمال الدالة الجديدة

wglCreateContextAttribsARB

واكون شاكر لك

بنتظار الرد

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#32

السلام عليكم

بنسبة للحرب ما بين

opengl v d3d

من كل النواحي المقارتة هي

لل

d3d

وقد نوقش الامر كثيرا

وانا اعتقد انه يعود للشخص وما يريد

وبصراحة انا ارتاح كثيرا

لل

opengl

لكن ذالك لا يمنع ان اطلع علي

d3d

والاستفادة منه

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#33

السلام عليكم

هذه مقدمة بسيطة للبداية بتعلم واستكشاف

opengl 3.0

وهي عبارة عن كود لربط المكتبة الجديدة مع

window

طبعا باستعمال دوال

api

طبعا

واولا ساذكر وحفظا لحقوق الملكية

ان الكود ليس لي تمام

انما قمت ببعض التغيرات

وهذا بالاعتماد علي درس للاخ الشمري حول ربط

opengl with window(api)

وكذالك درس لل

nehe

ما يميز كود الاخ الشمري الوضوح والاختصار والاهتمام بالامور الاساسية

اما دروس

nehe

فهي مفصلة وتحتاج الي خلفية واسعة ببرمجة بدوال

api

لذا اعتمدت طريقة الشمري وقمت باظافة الاكواد الجديدة لعمل

Context

وهذا هو الكود كاملا

#include <windows.h>
#include <GL/glu.h>
#include "wglext.h"
#include "gl.h"
#include <stdlib.h>

typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int * attribList);
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
#define WGL_CONTEXT_FLAGS_ARB 0x2094
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002

HDC hDC=NULL; //GDI Device Context
HGLRC hRC=NULL; //Permanent Rendering Context
HWND hWnd=NULL; //Holds Our Window Handle
HINSTANCE hInstance; //Holds The Instance Of The Application

/* WndProc is the Windows event handling routine
	 * hWnd - the window handle
	 * uMsg - event message for this window
	 * wParam, lParam - additional information depending on the message
*/

LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

/*	This method creates our OpenGL window.  Parameters are:					*
	 *	title			- Title To Appear At The Top Of The Window			*
	 *	width			- Width Of The GL Window Or Fullscreen Mode			*
	 *	height			- Height Of The GL Window Or Fullscreen Mode			*
	 *	bits			- Number Of Bits To Use For Color (8/16/24/32)			*
	 *	fullscreenflag	- Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)	*/

void CreateGLWindo(char *title,int width,int height,int bits);
void InitGL();
void Render();
void ShutDown();


int CreateGLWindow(char *title,int width,int hieght,int bits)
{
GLuint PixelFormat; // Holds The Results After Searching For A Match
WNDCLASS wc; // Windows Class Structure
RECT WindowRect; //// Grabs Rectangle Upper Left / Lower Right Values
// Set Left Value To 0
// Set Right Value To Requested Width
// Set Top Value To 0
// Set Bottom Value To Requested Height
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)hieght;

// Grab An Instance For Our Window
// Redraw On Move, And Own DC For Window
// WndProc Handles Messages - Trick here!
// No Extra Window Data
// No Extra Window Data
// Set The Instance
// Load The Default Icon
// Load The Arrow Pointer
// No Background Required For GL
// We Don't Want A Menu
// Set The Class Name
hInstance =GetModuleHandle(NULL);
wc.style =CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
wc.lpfnWndProc=(WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL";

if(!RegisterClass(&wc))	// Attempt To Register The Window Class
	{
		MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;	// Exit And Return FALSE
	}
AdjustWindowRectEx(&WindowRect, WS_OVERLAPPEDWINDOW, FALSE, WS_EX_APPWINDOW | WS_EX_WINDOWEDGE);  // Adjust Window To True Requested Size
hWnd=CreateWindowEx(WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
	   "OpenGL",
	   title,
	   WS_OVERLAPPEDWINDOW |
	   WS_CLIPSIBLINGS |
	   WS_CLIPCHILDREN,
	   0, 0,
	   WindowRect.right-WindowRect.left,
	   WindowRect.bottom-WindowRect.top,
	   NULL,
	   NULL,
	   hInstance,
	   NULL);
 hDC=GetDC(hWnd);
/******************** important *******************/
PIXELFORMATDESCRIPTOR pfd;
	memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));

   pfd.nSize	  = sizeof(PIXELFORMATDESCRIPTOR);
   pfd.nVersion   = 1;
pfd.dwFlags	= PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |
	 PFD_DOUBLEBUFFER;

   pfd.iPixelType = PFD_TYPE_RGBA;
   pfd.cColorBits = 16;
   pfd.cDepthBits = 16;


	PixelFormat=ChoosePixelFormat(hDC,&pfd);
	SetPixelFormat(hDC,PixelFormat,&pfd);
/****************************************************/

	HGLRC tempContext = wglCreateContext(hDC);
	wglMakeCurrent(hDC,tempContext);
	int attribs[] = {
		 WGL_CONTEXT_MAJOR_VERSION_ARB, 3,//we want a 3.0 context
		 WGL_CONTEXT_MINOR_VERSION_ARB, 0,
		 //and it shall be forward compatible so that we can only use up to date functionality
		 WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
	0}; //zero indicates the end of the array

	PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL; //pointer to the method
	wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress("wglCreateContextAttribsARB");
	if(wglCreateContextAttribsARB == NULL) //OpenGL 3.0 is not supported
	{
		MessageBox(NULL,"Cannot get Proc Adress for CreateContextAttribs", "ERROR",MB_OK);
		ShutDown();
		wglDeleteContext(tempContext);
		return FALSE;
	}

	if (!(hRC=wglCreateContextAttribsARB(hDC,0, attribs)))
	{
		wglDeleteContext(tempContext);
		 ShutDown();								// Reset The Display
		MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;								// Return false
	}
	wglDeleteContext(tempContext);

	if(!wglMakeCurrent(hDC,hRC))						// Try To Activate The Rendering Context
	{
		 ShutDown();						// Reset The Display
		MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;							// Return FALSE
	}

/*****************************************************/
	ShowWindow(hWnd,SW_SHOW);
	SetForegroundWindow(hWnd);
	SetFocus(hWnd);
	ShowCursor(FALSE);
	return 0;
};

void ReShape(GLsizei width,GLsizei height)
{
 if (height==0)
	{
 height=1;
	}

	glViewport(0,0,width,height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
};
void InitGL()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glEnable(GL_DEPTH_TEST);
};
void ShutDown( void )
{

	if(  hRC != NULL )
	{
 wglMakeCurrent( NULL, NULL );
 wglDeleteContext(  hRC );
  hRC = NULL;
	}

	if( hDC != NULL )
	{
 ReleaseDC( hWnd, hDC );
 hDC = NULL;
	}
};
void Render()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
   glLoadIdentity();
};
int WINAPI WinMain(	HINSTANCE hInstance_,HINSTANCE hPrevInstance,
LPSTR	lpCmdLine,int nCmdShow)
{
	MSG  msg;
	BOOL	done=FALSE;

	CreateGLWindow("OpenGL Framework",640,480,16  );
	ReShape(640,800);
	InitGL();

	while(!done)
	{
  PeekMessage(&msg,NULL,0,0,PM_REMOVE);

	 if (msg.message==WM_QUIT)
	 {
   done=TRUE;
	 }
	 else
	 {

	 Render();
	 SwapBuffers(hDC);


	 TranslateMessage(&msg);
	 DispatchMessage(&msg);
	 }





	}

 ShutDown();
	return (msg.wParam);

}
LRESULT CALLBACK WndProc( HWND  hWnd, UINT  msg,WPARAM wParam, LPARAM lParam )
{

	switch( msg )
	{

		case WM_KEYDOWN:
		{
			if( wParam ==VK_ESCAPE )
				 PostQuitMessage(0);

		}
		break;

		 case WM_SIZE:
		{
			/* تذكر ان
			   HIWORD(lParam) طول النافذة
			   LOWORD(lParam) عرض النافذة
			*/

			ReShape(LOWORD(lParam),HIWORD(lParam));
		}
		break;

		case WM_CLOSE:
		case WM_DESTROY:
		{
			PostQuitMessage(0);
		}
		break;

		default:
		{
			return DefWindowProc( hWnd, msg, wParam, lParam );
		}
		break;
	}

	return 0;
}

الاظافة كانت فقط بالاعتماد علي طريقة الجديدة لعمل

contex

اما الباقي فهو اعادة لدرس الشمري وهو موجود في المواصيع المثبة ويمكن الاطلاع عليه

طبعا الكود نقدر نقول انه سليم بنسبة

85%

وهو لم يعمل عندي لسبب بسيط جدا ان كرت الشاشة عندي

لايدعم

opengl 3.0

فيريت الاخوة الذي عندهم كروت لانفيديا

يجربو الكود و يصححون الكود ويطلعوننا علي النتائج

وهذا رابط للدرس من موقع

nehe opengl 3.0 lesson 01

سبب التعديل ان النسخة الاولي التي وصعتها احتوت علي بعض الاخطاء المعذرة وتم تصحيحها ان شاء الله

تم تعديل هذه المشاركة بواسطة aziz nor في 27 يونيو 2009 في 10:41

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

#34

شكرا لك , لم أنتبه لردك ..

حالياً حذفت الـ Driver , أنتظر نسخة نهائية من انفيديا , للتجربة مرة أخرى , التجربة السابقة فشلتك حتى مع دروس Nehe بدون تعديل .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#35

طبعا المثال المقدم من

طرف

nehe

لم يعمل معي

وهو يتوقف عند اختبار هل تم عمل

Create context

ام لا

الكود الجديد الذي وضعته

لم يظهر لي اخطا برمجية في الكود انما توقف عند المرحلة التي ذكرتها من قبل

لذا اردت اختبار الكود لنتاكد من النتائج ونطور الكود

وشكرا علي التواصل

اللهم صلي علي المصطفي محمد

صلي الله عليه وسلم

مواضيع مشابهة