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

color Key dans OPENGL (SDL_image

بدأه soumia alg في 25 أبريل 2010 · 9 رد · 1,739 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اريد المساعدة انا بحاجة الى احد يشرحلي كيفية عمل

color Key dans OPENGL

باستعمال SDL .

مع العلم اننى قمت بعملية الاكساء باستعمال SDL_IMAGE .

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

تم تعديل هذه المشاركة بواسطة الشمري في 26 أبريل 2010 في 14:48 — السبب: تعديل تنسيق الموضوع

#2
soumia alg كتب:

اريد المساعدة انا بحاجة الى احد يشرحلي كيفية عمل

color Key dans OPENGL

باستعمال SDL !!!!!!!!!!!

مع العلم اننى قمت بعملية الاكساء باستعمال SDL_IMAGE !!!!!!!!!!!!!!!!!!!

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

مالمقصود بكلمة dans ؟

مافهمته أن المقصود هو تطبيق قكرة Color Key و التي تقوم بإزالة اللون الغير مرغوب به من الصورة .

اذا كان هذا المقصود فالعملية يمكن أن تتم في OpenGL قبل أن يتم تصدير الصورة إليها من قبل SDL_IMAGE ، هناك مثال يوضح الفكرة موجود ضمن فهرس القسم :

ال Color Key مفهومه + تطبيق (باستخدام OpenGL)

المثال بسيط .. ولايحتاج لدهاء أو حنكة من أجل أن يُفهم ، لو كان غير واضح يمكن طرح الاشكال .

int r= 236 , g = 0 , b=140 

Image image = LoadRGBAImage ( " my image.bmp");
int size = image.width * image.height* 4; // 4 means 4 channels ( R G B A )
unsigned char *newData = new unsigned char[size];
data = image.data;
for(int i=0;i<size;i+=4)
{
 	newData= image.data;
 	neData[i+1]=image.data[i+1];
 	newData[i+2]=image.data[i+2];

 	if( newData== r &&
 	newData[i+1] == g &&
 	newData[i+2] == b)

 	newData[i+3]== 0

 	else
 	newData[i+3] == 255
}

بما أن المطلوب هو SDL_IMAGE فيجب تعديل الكود بحذف الدالة LoadRGBAImage وكتابة أسطر بديلة من عندك .. لأني عندما كتبت الكود لم أكن استخدم SDL_IMAGE .

الفكرة باختصار تكمن بنسخ قيم الالوان التي تم الحصول عليها من SDL_IMAGE إلى مصفوفة تستقبلها OpenGL لتحولها الى اكساء .. ولكن ولأننا نريد حذف المفتاح اللوني من الصورة .. نعمل loop ونستثني لون معين ، حسب الموجود في الصورة .. مثل اللون الوردي .

طبعاً الكلام السابق مبني على فرضية أن السؤال حول Color Key الذي أعرفه .. وهذا يعتمد على المقصود بكلمة dans ( يبدو لي أنها فرنسية ) .

بكل الأحوال ، ماهو مستواك في OpenGL ? هل هناك صعوبة في فهم الكود ؟ يمكن طرح المشكلة وتحديدها بالظبط حتى يمكن محاصرتها والقضاء عليها .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

شِكرااااااااااااااااااااااااا

اخي الشمري

لقد قمت بالتعديل ولكن هناك مشكل و هو انا المتغير الموضوع فيه الاكساء هو من نوع GLuint.

انا لقد غيرت المكتبة .

لقد وجدت الحل عندكم في المكتب glaux

لقد انزلت المكتب glaux ,وقمت بنسخ

glut32.dll to c:\windows\system,

glut32.lib to c:\program files\mingw\lib,

glut.h to c:\program files\mingw\include\GL.

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

glaux.a

ولكن هناك خطئ وهو

error

Faited to open DIB file colorkey.bmp.

مع العلم انني استعمل CodeBlocks

اما عن مستويا في opengl , فانا مبتدأ .

وانا مضطر الي العمل به لان الاستاد فرضه علي .لان مشروع تخرجي برنامج مكتوب بopengl

و انا احاول تعلم openglعن طريق internet

ارجوا منك افادتي

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

#4

الخطأ لأن مسار الصور Path يبدو خاطئ .. أو أن الصورة قد تحوي على عدد قنوات Channels مختلف ، لا أعرف . لكن من الأفضل نسيان GLAUX فهي قديمة ، المكتبة SDL_IMAGE مناسبة ..

اقتباس
لقد قمت بالتعديل ولكن هناك مشكل و هو انا المتغير الموضوع فيه الاكساء هو من نوع GLuint.

هذا عبارة عن unsigned int وهو رقم ( id ) ، للاكساء الحالي فقط .. وليس له علاقة بمكتبة الصور سواءً SDL_IMAGE أو أي مكتبة أخرى . مالمشكلة مع SDL_IMAGE ؟ ماهو الخطأ الذي يظهر ؟ ممكن وضع جزئية الكود الخاصة بتحميل الصورة وتحويلها إلى اكساء ، حتى تتم معالجة الاشكال إن شاء الله ، باستخدام SDL_IMAGE

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#5

جزئية الكود الخاصة بتحميل الصورة وتحويلها إلى اكساء

هي في الملفات المرفقة.

شكرااااااااااااااااااا على الرد

texture (SDL_IMAGE).rar

تم تعديل هذه المشاركة بواسطة soumia alg في 27 أبريل 2010 في 17:32

#6

يظهر من الكود أن المستخدم هو أربع قنوات RGBA ، وبالتالي المهمة ستكون أسهل بكثير .

- يجب عمل loop على المصفوفة pixels الموجودة في التركيب SDL_Surface ( يجب ملاحظة أن pixels عبارة عن *void ، وبالتالي من الممكن أن يظهر خطأ اذا لم يتم عمل Cast إلى unsigned char مثلاً ، لا اذكر بصراحة ..

- كل مرة يجب التشييك على اللون الوردي ، اذا كان البكسل الحالي ذو لون وردي .. يجب تغيير قيمة ألفا إلى الصفر حتى يبدو البكسل شفافاً .

- Loop ينتهي عند عدد البسكلات وهي تساوي" الطول * العرض * عدد القنوات في كل بكسل " ، على اعتبار أن نوع البيانات هو Unsigned char .

- يجب تفعيل Alpha Testفي OpenGL .

مثال عام :

GLuint loadTexture(const char * filename,bool useMipMap)
{
	GLuint glID;
	SDL_Surface * picture_surface = NULL;
	SDL_Surface *gl_surface = NULL;
	SDL_Surface * gl_fliped_surface = NULL;
	Uint32 rmask, gmask, bmask, amask;

	picture_surface = IMG_Load(filename);
	if (picture_surface == NULL)
 	return 0;

#if SDL_BYTEORDER == SDL_BIG_ENDIAN

	rmask = 0xff000000;
	gmask = 0x00ff0000;
	bmask = 0x0000ff00;
	amask = 0x000000ff;
#else

	rmask = 0x000000ff;
	gmask = 0x0000ff00;
	bmask = 0x00ff0000;
	amask = 0xff000000;
#endif

	SDL_PixelFormat format = *(picture_surface->format);
	format.BitsPerPixel = 32;
	format.BytesPerPixel = 4;
	format.Rmask = rmask;
	format.Gmask = gmask;
	format.Bmask = bmask;
	format.Amask = amask;
	gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWSURFACE);

	gl_fliped_surface = flipSurface(gl_surface);

	int size = format.BytesPerPixel * gl_fliped_surface->w * gl_fliped_surface->h;
	int r= 236 , g = 0 , b=140 ;
	for(int i=0;i<size;i+=4)
	{
			if( gl_fliped_surface->pixels== r &&
			gl_fliped_surface->pixels[i+1] == g &&
			gl_fliped_surface->pixels[i+2] == b)

			gl_fliped_surface->pixels[i+3]= 0

			else
			gl_fliped_surface->pixels[i+3] = 255
	}
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);



	glGenTextures(1, &glID);

	glBindTexture(GL_TEXTURE_2D, glID);


 	glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
 	gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
 	gl_fliped_surface->pixels);



	SDL_FreeSurface(gl_fliped_surface);
	SDL_FreeSurface(gl_surface);
	SDL_FreeSurface(picture_surface);

	return glID;
}

المثال لم أجربه ، لم أثبت SDL حالياً ، لكن اذا ظهرت مشاكل يمكن السؤال . يجب عدم نسيان تفعيل مزج الألوان أو Alpha Test في OpenGL .

 glEnable( GL_BLEND );
 // A=255 // one-> 255 - A= 255-255=0
 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
 glEnable(GL_TEXTURE_2D);

ملاحظة على الهامش :

فلاتر الاكساء يجب أن تكون Nearest ، حتى لاتحدث عملية تنعيم أو Smoothing للبكسلات فتظهر أطراف الصورة بلون وردي بسبب عملية الفلترة ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#7

شكراااااااااااااااااااااااااااااااااا

والله يجعلها في ميزان حسناتك.

مازال عندى error

في if( gl_fliped_surface->pixels== r

اريد ان اسألك يوجد في opengl sdl

دالة تقوم به هذا العمل وهي SDL_SetColorKey

وانا لم اعرف العمل بها

وهي مشروح في

http://www.siteduzero.com/tutoriel-3-14098-afficher-des-images.html#ss_part_2

اعلم انني كثيرة الاسئلة لكن ليس لدي من يساعدني

ارجوا منك تحملي

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

#8

كثرة الأسئلة أفضل من السكوت عن جهل << حكمة .

SDL_SetColorKey : لااذكر بالظبط ماذا تفعل ، ولكن ما أعرفه أنها تنفع ، اذا كانت المكتبة الرسومية المستخدمة هي SDL .

SDL تتيح لك نمطين على الأقل :

1- النمط الأول هو أن تُستخدم لوحدها ، حينها وبطريقتها ، ستقوم SDL بانتاج الرسوميات بنفسها ، أي أنها ستوفر لك دوال مثل : SDL_DrawSurface ( مثال فقط ) ، لتقوم بالرسم .. في تلك الحالة ، SDL_SetColorKey يمكن استخدامها .

2- النمط الآخر : ان تكون SDL مجرد جسر عبور ، تقوم بانشاء النافذة - تحميل بيانات الصور - توفير نظام للمدخلات Keyboard أو Mouse ، وتترك عملية الرسم للمكتبة OpenGL مثلاً .

هنا ، ليس كل دوال SDL صالحة للاستعمال ، بعضها قد يفشل لاستخدامك سياق آخر مختلف نهائياً عن المتبع في OpenGL .

لست متأكد من SDL_SetColorKey ، هل يمكن أن تعمل مع OpenGL ولكن وبكل الأحوال لاحاجة لها .. والخطأ الذي ظهر لك يمكن اصلاحه . المعذرة ، هذه الأيام كسول ولم أثبت SDL .. ولا أعرف ماهو الخطأ بالظبط ولكن ماهو الخطأ الذي يظهر ؟ ما نصّه ؟

يمكن عمل Cast بهذه الطريقة ، لعلها تنجح :

GLuint loadTexture(const char * filename,bool useMipMap)
{
 	GLuint glID;
 	SDL_Surface * picture_surface = NULL;
 	SDL_Surface *gl_surface = NULL;
 	SDL_Surface * gl_fliped_surface = NULL;
 	Uint32 rmask, gmask, bmask, amask;

 	picture_surface = IMG_Load(filename);
 	if (picture_surface == NULL)
 	return 0;

#if SDL_BYTEORDER == SDL_BIG_ENDIAN

 	rmask = 0xff000000;
 	gmask = 0x00ff0000;
 	bmask = 0x0000ff00;
 	amask = 0x000000ff;
#else

 	rmask = 0x000000ff;
 	gmask = 0x0000ff00;
 	bmask = 0x00ff0000;
 	amask = 0xff000000;
#endif

 	SDL_PixelFormat format = *(picture_surface->format);
 	format.BitsPerPixel = 32;
 	format.BytesPerPixel = 4;
 	format.Rmask = rmask;
 	format.Gmask = gmask;
 	format.Bmask = bmask;
 	format.Amask = amask;
 	gl_surface = SDL_ConvertSurface(picture_surface,&format,SDL_SWSURFACE);

 	gl_fliped_surface = flipSurface(gl_surface);
		unsigned char *myPixels =(unsigned char *) gl_fliped_surface->pixels;

 	int size = format.BytesPerPixel * gl_fliped_surface->w * gl_fliped_surface->h;
 	int r= 236 , g = 0 , b=140 ;
 	for(int i=0;i<size;i+=4)
 	{
 	if( myPixels== r &&
 	myPixels[i+1] == g &&
 	myPixels[i+2] == b)

 	myPixels[i+3]= 0

 	else
 	myPixels[i+3] = 255
 	}
 	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);



 	glGenTextures(1, &glID);

 	glBindTexture(GL_TEXTURE_2D, glID);


 	glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_fliped_surface->w,
 	gl_fliped_surface->h, 0, GL_RGBA,GL_UNSIGNED_BYTE,
 	myPixels);



 	SDL_FreeSurface(gl_fliped_surface);
 	SDL_FreeSurface(gl_surface);
 	SDL_FreeSurface(picture_surface);

 	return glID;
}

التغييرات في عمل Cast هكذا :

		unsigned char *myPixels =(unsigned char *) gl_fliped_surface->pixels;

ثم استخدام myPixels بباقي الكود .

لم أجرب هذا الكود أيضاً ، ولكن اذا ظهر خطأ ، يمكن كتابته هنا ، وسأقوم بتنزيل SDL وتثبيتها .. أتمنى أن ننجح هذه المرة .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#9

شكراااااااااااااااااااااااااااااااااااااااا

على المساعدة

المشكل الان هو في exécution

مكان الاكساء كامل اصبح لونه ابيض

هذا هو المشكل .

ممكن السبب انني لم اضع هدا الكود في المكان المناسب.

glEnable( GL_BLEND );

// A=255 // one-> 255 - A= 255-255=0

glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );

glEnable(GL_TEXTURE_2D);

اين مكانوا الاصلي

اكررشكريييييييييييييي

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

تم تعديل هذه المشاركة بواسطة soumia alg في 29 أبريل 2010 في 00:01

#10

وفقك الله أختي

الجزائر قلبي وغزة نبضه

2522zn0.png

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