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

الاكساء في OpenGL >>تقدر تقول دروس

بدأه Abdullah.Alshammeri في 25 ديسمبر 2005 · 11 رد · 8,726 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

هذه سلسلة من التطبيقات التي سنعملها معا .. لمحاولة فهم آلية الاكساء .. في opengl .

ماهو الاكساء ..

وضع صورة على شكل ما .. بابسط تعبير .

شاهد الصورة ( للاعضاء ) ,

25_12_05_12_20_53_1135542053aa.JPG

أتمنى ان لاتنتقل من خطوة الا وانت فاهمها .. لاني وضعت عدة تطبيقات متتابعة ..لاتترك شيء الا وانت فاهمه .. لان الدروس متصلة ..

في OpenGL يمر الاكساء في ثلاث مراحل رئيسية :

1- تقوم بتحميل الصورة التي تريد .

قد يتطلب الامر سطر واحد اذا كنت تستخدم دوال جاهزة .. وقد يتطلب الامر منك 50 سطر اذا لم تستخدم دوال جاهزة .

في opengl يوجد دالة مساعدة لتحميل ملفات bmp .

وبالتالي تحمل الصورة في اقل من سطرين .

لكن هناك بعض الانساق مثل tga و pcx و jpg .. التي تتميز اما بوجود قناة الفا .. او بصغر الحجم ...... الخ .. وبالتالي يتطلب الامر قراءة تلك الصور من الصفر او تستخدم مكتبة مساعدة.

2- بعد ان حملت الصورة ... تخبر opengl بانك تريد ان تضع هذه الصورة كاكساء .. وايضا تضع فلاتر الاكساء التي تريد .. هل تريد الاكساء واضح وخالي من التشويش .. او تريد اداء اسرع وبالتالي اكساء اقل دقة ..

وايضا تخبر Opengl بعرض وطول الصورة التي تريدها كاكساء . . الخ .

3- تعين الاكساء على الشكل الذي تريده .. وذلك بان تضع الاحداثيات المناسبة .

دعنا نطبق ...

انسخ هذا الكود وألصقه :

/*1*/	GLuint  ID_1;


/*2*/	void LoadTexture(char *FileName ,  GLuint *ID)
/*3*/	{
/*4*/	FILE *File=NULL;         

/*5*/	File=fopen(FileName,"r");    

/*6*/	if (File)           
/*7*/	{
/*8*/	fclose(File);   
/*9*/	}

/*10*/	AUX_RGBImageRec *TextureImage=new(AUX_RGBImageRec);      
/*11*/	memset(TextureImage,0,sizeof(void *)*1);            
/*12*/	TextureImage = auxDIBImageLoad(FileName);



/*13*/	glGenTextures(1, ID);      
/*14*/	glBindTexture(GL_TEXTURE_2D,*ID);

/*15*/	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
/*16*/	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
/*17*/	glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);



/*18*/	free(TextureImage->data);	
/*19*/	free(TextureImage);  

/*20*/	}

1- السطر الاول : انشأنا متغير من نوع Gluint ليحمل الاكساء الذي نريد لاحقا ... لابد ان يكون من نوع Gluint .

2- السطر الثاني اعلنا عن دالة ... وسمها ماشئت .. الهدف تنظيمي فقط .

نريد تمرير بارمترين لها .. الاول مكان الصورة .. الثاني المتغير الذي سيحمل الاكساء ..

لاحظ اننا وضعنا المتغير مؤشر .. حتى يظل محتفظا بقيمته حتى بعد الخروج من هذه الدالة . .

راجع المؤشرات في السي .. للمزيد .. من التوضيح .

3- من السطر الرابع الى التاسع فتحنا ملف للقراءة وهذا الملف هو ماسيكون في بارمتر الدالة الاول .

ثم اذا سار كل شيء على مايرام .. اغلق الملف .. وانتهى الامر .

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

4- السطر العاشر اعلنا عن تركيب جديد من نوع AUX_RGBImageRec .. صيغته :

typedef struct _AUX_RGBImageRec {
    GLint sizeX, sizeY;
    unsigned char *data;
} AUX_RGBImageRec;

اذا التركيب مكون من طول وعرض وبيانات الصورة التي نريد ان نفتحها .. عندما نقرأ الصورة بعد قليل سيتم تخزين البيانات الثلاث (الطول والعرض والمحتوى) في هذا التركيب ..

5- السطر الثاني عشر حملنا الصورة .... عن طريق الدالة auxDIBImageLoad هذه الدالة تطلب بارمتر واحد هو الصورة التي نريد فتحها .. طبعا سنمرره بعد قليل .

وتعيد هذه الدالة قيمة تمثل تركيب من نوع AUX_RGBImageRec بالتالي محتوى الصورة المفتوحة وطولها وعرضها سينتقلان الى تركيبنا " TextureImage" .. الان انتهينا من اول خطوة وهو فتح صورة من نوع BMP .

بالتالي

TextureImage->sizeX يمثل عرض الصورة

TextureImage->sizeYيمثل طول الصورة

TextureImage->data يمثل محتوى او بيانات تلك الصورة

ننتقل الى الخطو التالية وهي تعيين الصورة التي فتحناها كاكساء .

/*21*/	glGenTextures(1, ID);      
/*22*/	glBindTexture(GL_TEXTURE_2D, *ID);

/*23*/	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
/*24*/	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
/*25*/	glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);



/*26*/	free(TextureImage->data);	
/*27*/	free(TextureImage);  

/*28*/	}

1- في السطر الواحد والعشرين نقول لـ opengl احجز لنا موقعا لاكساء واحد نريد ان نستخدمه (glGenTextures)

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

البارمتر الثاني عنوان المتغير الذي سيحمل هذا الاكساء ...

2- في السطر الثاني والعشرين .. نعمل للمتغير الذي يحمل الاكساء Bind يعني أي عملية تالية ستؤثر على هذا الاكساء ..

نوضح اكثر .. لنفرض عندنا اكسائين ..

glGenTextures(1, ID);
glGenTextures(1, ID2);

الان نريد التعديل على الاكساء الاول :

glBindTexture(GL_TEXTURE_2D, *ID);
.
.
.

الان نريد التعديل على الاكساء الثاني :

glBindTexture(GL_TEXTURE_2D, *ID2);

بالنسبة للبارمتر الاول دائما نضعه GL_TEXTURE_2D افضل .. واسهل :P

3- السطر الثالث والعشرين والرابع والعشرين نعين فلاتر الاكساء ... بصراحة الطريقة صعبة وعقيمة ..

بالعربي

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

اكساء ليس بدقة عالية .

اما

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

اكساء بدقة عالية ..

4- السطر الخامس والعشرين .. glTexImage2D تضع بيانات الصورة التي حملناها في المتغير ID .

بالبتالي المتغير ID صار يحمل بيانات تلك الصورة ... ومتوافق مع opengl وبالتالب احاجة لنا بالتركيب TextureImage

اذا /

نفرغه من الذاكرة

free(TextureImage->data);	
free(TextureImage);

تفصيل اكثر حول glTexImage2D

هذه الدالة تطلب معلومات عن الصورة . طولها وعرضها ومحتواها الخ ..

وبالتالي نستطيع استخدام هذه الصورة كاكساء .

صيغتها :

glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

******

البارمتر الاول دائما :GL_TEXTURE_2D ..

البارمتر الثاني دائما صفر ( هذا خاص بالاكساء السمى MIPMAPPING ,, سنعرفه لاحقا ) ,

البارمتر الثالث : عدد قنوات الالوان .. عندنا اربع قنوات RED و GREEN و BLUE و ALPHA .

اذا كتبنا " 1 " يعني red فقط .. اذا كتبنا 2 ,,يعني red , alpha واذا كتبت " 3 " يعني RGB .. واذا كتبنا 4 يعنيRGBA

مو مهم شرحها الان :D

البارمتر الرابع والخامس .. عرض وارتفاع الصورة .

البارمتر السادس : حدود الصورة .. دائما نضع صفر .

البارمتر السابع : يأخذ احد القيم التالية :

GL_COLOR_INDEX

GL_STENCIL_INDEX

GL_DEPTH_COMPONENT

GL_RED

GL_GREEN

GL_BLUE

GL_ALPHA

GL_RGB

GL_RGBA

GL_LUMINANCE

GL_LUMINANCE_ALPHA

ضع GL_RGB .. حيث نريد استخدام ثلاث قنوات .. حيث هذا هو تنسيق الصورة .

البارمتر الثامن البيانات التي تريد تحميلها من أي نوع ؟ .. هنا من نوع GL_UNSIGNED_BYTE ..

حيث ان TextureImage->data من نوع unsigned char .

بهذا انهينا نصف المشوار ...

لكن لن يعلم تطبيقنا عن دالة الاكساء شيء ..

بعد ان تنشئ النافذة .. وتضع اعدادات opengl ... اضف هذا السطر . .الى الاعدادات

glEnable(GL_TEXTURE_2D);
LoadTexture("image.bmp" ,&D_1)

فعلنا الاكساء .. ثم استدعينا الدالة التي انشاناها قبل قليل ..

الان ID_1 يحمل الصورة ..image.bmp

في دالة الرسم render ..

/*1*/	void Render()
/*2*/	{
/*3*/	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

/*4*/	glLoadIdentity();        
/*5*/	glTranslatef(-1.0f,0, -3.0f );


/*6*/	glBindTexture(GL_TEXTURE_2D,  ID_1);

/*7*/	glBegin(GL_QUADS);////

/*8*/	glTexCoord2f(0.0f, 0.0f);
/*9*/	glVertex2f(-0.5f, -0.5f );

/*10*/	glTexCoord2f(1.0f, 0.0f);
/*11*/	glVertex2f( 0.5f, -0.5f );

/*12*/	glTexCoord2f(1.0f, 1.0f);
/*13*/	glVertex2f( 0.5f,  0.5f );

/*14*/	glTexCoord2f(0.0f, 1.0f);
/*15*/	glVertex2f(-0.5f,  0.5f );

/*16*/	glEnd();
/*17*/	}

السطر السادس قمنا باختيار المتغير الذي يحمل قيمة الاكساء تمهيدا لوضعه على المجسم ..

الدالة glTexCoord2f تحدد احداثيات الاكساء لجسم ..

سنتحدث عن احداثيات الاكساء في جلسة مقبلة ... ان شاء الله .

الخلاصة : 1- نحمل الصورة التي نريد .. ويهمنا ثلاث معلومات .. الطول والعرض ومحتوى الصورة..

2- نعد الاكساء ونعين خصائصه .

3- نفعل الاكساء ثم نعين احداثياته .

4- يجب ان تكون ابعاد الصورة .. 2*2 او 4*4 او 8*8 او 16*16 او 32*32 او 64*64 او 128 *128 الخ .. يعني (2^n)

ولكن احيانا نزيد 2 بيكسل للصورة وذلك كحدود .. فتصبح مثلا 66*66 .

المرفقات ,,,

1_texture_glut.zip

1_texture_win.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

احداثيات الاكساء ..

اعتذر بداية عن كثرة الصورة ...

أي صورة في opengl تأخذ هذه الاحداثيات

26_12_05_02_29_08_11356361481.JPG

الزاوية اليسرى السفلية : احداثيها السيني (x) = صفر وايضا احداثيها الصادي صفر .

الزاوية اليمنى السفلية : احداثيها السيني = 1 وايضا احداثيها الصادي صفر .

الزاوية اليمنى العلوية: احداثيها السيني = 1 وايضا احداثيها الصادي 1 .

الزاوية اليسرى العلوية: احداثيها السيني = صفر وايضا احداثيها الصادي1.

اذا فهمت ذلك ... تكون استوعبت طريقة احداثيات الاكساء ..

خلونا نأخذ مثال ::

هذه صورة

26_12_05_02_29_32_1135636172_.JPG

وهذا شكل مستطيل قمنا برسمه ..

26_12_05_02_29_50_11356361903.JPG

لاحظ كيف نقوم بأكسائه ..

26_12_05_02_30_09_11356362094.JPG

والنتيجة :

26_12_05_02_30_29_11356362295.JPG

كل رأس من الصورة يقابله رأس من المضلع اذا يصبح الكود .

سنبدأ من الزاوية السفلية اليمنى .. طبعا ليس شرطا لكن المهم ان تبدأ من جهة وتستمر بالاتجاه الصحيح

	glBegin(GL_QUADS);////

  glTexCoord2f(0.0f, 0.0f);
  glVertex2f(-2, 0 );

  glTexCoord2f(1.0f, 0.0f);
  glVertex2f( 2, 0 );
  
  glTexCoord2f(1.0f, 1.0f);
  glVertex2f( 2,  3 );
  
  glTexCoord2f(0.0f, 1.0f);
  glVertex2f(-2,  3 );
 	 
  glEnd();

أتمنى من كل قلبي ان الفكرة وصلت .

الان مارأيك لو أردنا ان نقلب الصورة ..

لاحظ

26_12_05_02_30_51_11356362516.JPG

وبالتالي الصورة ستكون مقلوبة ..

فقط اضرب احداثيات الاكساء في -1 حتى ينقلب اتجاه الصورة ....

	glBegin(GL_QUADS);////

  glTexCoord2f(0.0f, 0.0f);
  glVertex2f(-2, 0 );

  glTexCoord2f(-1.0f, 0.0f);
  glVertex2f( 2, 0 );
  
  glTexCoord2f(-1.0f, -1.0f);
  glVertex2f( 2,  3 );
  
  glTexCoord2f(0.0f, -1.0f);
  glVertex2f(-2,  3 );
 	 
	glEnd();

في المرفقات تطبيق ..حيث رسمنا اربع اشكال ...كل شكل قمنا باكسائه نفس الصورة لكن غيرنا في الاتجاهات ..

26_12_05_02_31_12_11356362727.JPG

2_texture_glut.zip

2_texture_win.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

الان سنضيف بعض الامور الجديدة مثل :

فلاتر الاكساء و الاكساء من نوع MipMapping ..

في الامثلة السابقة نعين فلاتر الاكساء كالتالي :

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

لكن هناك طريقة اخرى ::: وهي ان تجعل فلتر GL_TEXTURE_MAG_FILTER هو GL_NEAREST

ونفس الامر مع GL_TEXTURE_MIN_FILTER .

الفرق أن GL_NEAREST أقل دقة .. أما GL_LINEAR فأكثر دقة ..

لاحظ الصورتين :

5b2ba70040.jpg

اذا اردت ان تعلم كيف حصل ذلك فارجع الى المذكرات والكتب المتخصصة .. : )

اكساء ال MipMapping ..

من الصعب شرح كيف يعمل هذا الاكساء لكن فقط يكفينا ان نفرق بين اكساء من نوع MipMapping واكساء عادي ..

بملاحظة هذه الصورة .

8c6352a674.jpg

الاكساء .. عندما استخدمنا mipmapping

5113ae7b60.jpg

الاكساء المعتاد .

ابحث في المراجع ,, لتعرف كيف يعمل هذا النوع من الاكساء . . . وماهي ايجابياته .

لتقوم بهذا النوع من الاكساء فقط ,,, تضيف شيء شبيه بهذه السطور .

/*1*/glGenTextures(1,  ID);      
/*2*/glBindTexture(GL_TEXTURE_2D, *ID);
// Create MipMapped Texture
/*3*/glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
/*4*/glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
/*5*/	gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 
TextureImage->sizeX, TextureImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
 TextureImage->data);

مصفوفة الاكساء :

لم أرى الكثير من الامثلة حول هذا الموضوع ,, لا اعلم السبب ..

هل لانه موضوع غير مهم .

او انه صعب .

شخصيا اراه من اسهل المواضيع ... و له فائدة كبيرة .. خاصة لمن تعقد من مسألة احداثيات الاكساء .

مقدمة :

يوجد ثلا انواع من المصفوفات في openGL .

الاولى /

مصفوفة ال projection .

بالعربي : مصفوفة الاسقاط .

وهي التي نستخدمها عندما نريد تغيير طريقة العرض ,, الاحداثيات ... منفذ الرؤية .

بالتالي اذا اخترت هذه المصفوفة ...

فانه أي تغيير في الازاحة او التدوير او التحجيم ..سيؤثر على هذه المصفوفة مثلا ..

glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
  gluPerspective(45.0, (float)w/(float)h, 1.0, 800.0);

عندما ( صفرت ) المصفوفة ... أي اعدتها لوضعها الاصلي ..

فان الذي تأثر هو مصفوفة الاسقاط فقط .

الثانية /

مصفوفة النماذج ( الاشكال )

MODEL VIEW

اذا اخترت هذه المصفوفة .. فان أي ازاحة او تدوير او تحجيم .. انما سيؤثر بالنقاط Vertex . . وبالتالي المجسمات والاشكال الظاهرى على الشاشة .

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(-2.0f,0, -22.0f );
	rot+=0.1f;
	glRotatef(rot,1,0,0);
	glBegin(GL_QUADS);
  glVertex2f(-4, 0 );
  glVertex2f( 4, 0 );
  glVertex2f( 4,  3 );
  glVertex2f(-4,  3 );
	glEnd();

الان اذا قمت بالازاحة او التدوير .. فان الذي سيتأثر هو المجسم الظاهر على اشاشة وليس ... منفذ الرؤية ونحو ذلك .

ثالثا /

مصفوفة الاكساء .

TEXTURE

أي ازاحة او تدوير او تحجيم فان الذي سيتأثر هو الاكساء واحداثياته ..

وهنا سنفصل قليلا :

الفائدة من مصفوفات الاكساء :

اذا دخلنا في مصفوفة الاكساء نستطيع ان نجري جميع عمليات التحريك والتدوير ..

بالتالي سنقلل ( التفكير ) ,,

فتخيل انك تريد ان تقلب صورة بزاوية 45 درجة .. لتستخدمها في الاكساء .

الحل البديهي ان تغير قيم احداثيات الاكساء حتى تحصل على نتيجة مقاربة .

لكن اذا استخدمت مصفوفة الاكساء .. هي ستقوم بكل ما تريد .

مثال /

قبل ان اضع المثال اريد ان اقول .. انه من عندي  ,, طبعا ليس للتفاخر لكن لاني بحث في الامثلة الموجودة عندي ولم اجد المثال بشكل كامل ,, لذا من الممكن ان تكون الطريقة التي ستراها ليست هي الافضل .. او .. ليست صحيحة .. بالرغم من ان النتيجة ظهرت كما اريد . : )

/*1*/  glMatrixMode(GL_TEXTURE);
/*2*/  glPushMatrix();

/*3*/  glRotatef(90,0,0,1);

/*4*/  glMatrixMode(GL_MODELVIEW);
/*5*/  glTranslatef(-2.0f,0, -22.0f );
/*6*/ 	 glBindTexture(GL_TEXTURE_2D,  ID_1);
/*7*/ 	 glBegin(GL_QUADS);////

/*8*/ 	 glTexCoord2f(0.0f, 0.0f);
/*9*/ 	 glVertex2f(-4, 0 );

/*10*/ 	 glTexCoord2f(1.0f, 0.0f);
/*11*/ 	 glVertex2f( 4, 0 );
  
/*12*/ 	 glTexCoord2f(1.0f, 1.0f);
/*13*/ 	 glVertex2f( 4,  3 );
  
/*14*/ 	 glTexCoord2f(0.0f, 1.0f);
/*15*/ 	 glVertex2f(-4,  3 );
 	 
/*16*/ 	 glEnd();


/*17*/  glPopMatrix();

في السطر الاول دخلنا في مصفوفة الاكساء .

السطر الثاني الهدف منه حفظ قيم المصفوفة ( راجع درس الماتركس في opengl )

السطر الثالث دورنا الاكساء 90 درجة .... لاحظ ان التأثير سيقع فقط على صورة الاكساء وليس على الشكل وذلك لاننا تحت تأثر مصفوفة الاكساء .

السطر الرابع رجعنا الى مصفوفة الاشكال ( النقاط ) ,

وبالتالي ستظهر الاشكال ..

في السطر الخامس ازحنا الشكل ( لاحظ ان الازاحة سيتأثر بها الشكل وليس الاكساء لاننا الان تحت تأثير model ..

باقي السطور ماهي الا رسم فقط .

والنتيجة ..

الصورة مقلوبة 90 درجة ...

يفضل عندما تدخل في أي مصفوفة ( اكساء – اسقاط – نقاط ) ,, ان تعيد المصفوفة للنقاط الاصلية وذلك بكتابة

	glMatrixMode(GL_.........);
	glLoadIdentity();

الا اذا كان التطبيق لا يحتاج الى ذلك .

TexMat_glut.zip

TexMat_WIN.zip

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4

لسلام عليكم ..

لحد هنا وكفاية ..

بعد عبارات الشكر والثناء ماتوفي .. بس ، سيبقى الدعاء ..

و الله كما ذكرت اخي .. جواهر المنتدى ..

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

بكل تأكيد لو في اسئلة راح ارجعلك .. و انا عارف راح اتعبك معاي ..

جزاك الله خير الجزاء على هذا المجهود المتميز

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#5

جزاك الله خيراً ... موضوع جيد ...

لكني أريد أن أحمل الصور في jogl و ليس في C++ ...

طبعاً أعرف كيف أستعمل الدوال في جافا ... لكن أين أجد دالة auxDIBImageLoad ؟؟؟

#6

حسب ما اذكر .. يوجد في jogl كلاس لتحميل الصور ..

أعدك ان شاء الله باعادة قراءة jogl .. ودليلها ... حتى نضع بعض الامثلة ان شاء الله ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

هل تقصد class Image و Graphics2D.DrawImage و class ToolKit و دالة getImage ؟؟؟

#8

OpenGL .. لا تدري أين تشتغل .. ولايهمها ذلك ..

كل ماتريده OpenGL منك أربعة أمور لا أقل ولا أكثر :

1- بيانات الصورة .. وغالبا تكون مصفوفة من البايتات Bytes .

2- عرض الصورة .

3- طول الصورة .

4- نوع الصورة .. أو عدد قنوات الصورة RGB - RGBA - .. حتى تعرف كيف سيتم ترتيب البايتات ..

لذلك اذا استطعت بأي طريقة أن تخدم OpenGL .. وتقدم لها هذه المعلومات .. فانها ستكون ممنونة لك .

الجافا تحوي كلاسات لتحميل الصور .. لكن يجب ان تنتبه .. أن هذه الصور لن يتم ضغطها .. ويجب أن تعرف ترتيب الالوان داخلها ..

لذلك .. لمكتبات المساعدة مع JOGL تقوم بهذه الغرض ,.

اذا أردت أن تتعلم الاكساء في OpenGL دون مساعدة أحد :

http://download.java.net/media/jogl/builds...javadoc_public/

وهو كلاس لتحميل صور tga ..

ستجد فيه أربع دوال مهمة هي التي تطلبها OpenGL :

getWidth

getHeight

getGLFormat

getData

ويوجد كلاس آخر اسمه Texture يساعدك ويسهل عليك .. لكن ما انصح به .. هو ان تتعلم من الصفر .. ثم تلجأ بعد ذلك للكلاسات المساعدة اذا أحببت ذلك .

قمت بقراءة jogl .. يبدو لي أنها قوية أكثر من اللازم .. يوجد مكتبة اخرى أفضلها لسهولتها ..

http://lwjgl.org

حيث أنها قامت بدعم المكتبة الرائعة Devil .. المسؤولة عن تحميل عشرات الانساق من الصور ..

لذلك انصح بالقاء نظرة عليها ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10

جاني ERROR

في AUX_RGBImageRec *TextureImage=new(AUX_RGBImageRec) ;

ايه الحل

و جزاكم الله الف خيرررررررررررررررررررر

#11

سأقوم ان شاء الله بكتابة مقال بديل ، المقال الحالي قديم .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#12
الشمري كتب:

سأقوم ان شاء الله بكتابة مقال بديل ، المقال الحالي قديم .

أتمنى ذلك

إن شاء الله يكون في أقرب وقت

لأني محتاج إلى موضوع الاكساء ضروري

وأنت ما شاء الله طريقتك مفهومة ف الشرح

بارك الله فيك

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