اريد المساعدة انا بحاجة الى احد يشرحلي كيفية عمل
color Key dans OPENGL
باستعمال SDL .
مع العلم اننى قمت بعملية الاكساء باستعمال SDL_IMAGE .
جزاكم الله الف خير.
اريد المساعدة انا بحاجة الى احد يشرحلي كيفية عمل
color Key dans OPENGL
باستعمال SDL .
مع العلم اننى قمت بعملية الاكساء باستعمال SDL_IMAGE .
جزاكم الله الف خير.
تم تعديل هذه المشاركة بواسطة الشمري في 26 أبريل 2010 في 14:48 — السبب: تعديل تنسيق الموضوع
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 ? هل هناك صعوبة في فهم الكود ؟ يمكن طرح المشكلة وتحديدها بالظبط حتى يمكن محاصرتها والقضاء عليها .
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
شِكرااااااااااااااااااااااااا
اخي الشمري
لقد قمت بالتعديل ولكن هناك مشكل و هو انا المتغير الموضوع فيه الاكساء هو من نوع 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
ارجوا منك افادتي
و جزاك الله كل خيرررررررررررررررررررررر
الخطأ لأن مسار الصور Path يبدو خاطئ .. أو أن الصورة قد تحوي على عدد قنوات Channels مختلف ، لا أعرف . لكن من الأفضل نسيان GLAUX فهي قديمة ، المكتبة SDL_IMAGE مناسبة ..
اقتباسلقد قمت بالتعديل ولكن هناك مشكل و هو انا المتغير الموضوع فيه الاكساء هو من نوع GLuint.
هذا عبارة عن unsigned int وهو رقم ( id ) ، للاكساء الحالي فقط .. وليس له علاقة بمكتبة الصور سواءً SDL_IMAGE أو أي مكتبة أخرى . مالمشكلة مع SDL_IMAGE ؟ ماهو الخطأ الذي يظهر ؟ ممكن وضع جزئية الكود الخاصة بتحميل الصورة وتحويلها إلى اكساء ، حتى تتم معالجة الاشكال إن شاء الله ، باستخدام SDL_IMAGE
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
جزئية الكود الخاصة بتحميل الصورة وتحويلها إلى اكساء
هي في الملفات المرفقة.
شكرااااااااااااااااااا على الرد
تم تعديل هذه المشاركة بواسطة soumia alg في 27 أبريل 2010 في 17:32
يظهر من الكود أن المستخدم هو أربع قنوات 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 للبكسلات فتظهر أطراف الصورة بلون وردي بسبب عملية الفلترة ..
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
شكراااااااااااااااااااااااااااااااااا
والله يجعلها في ميزان حسناتك.
مازال عندى 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
اعلم انني كثيرة الاسئلة لكن ليس لدي من يساعدني
ارجوا منك تحملي
وجزاك الله الف خير
كثرة الأسئلة أفضل من السكوت عن جهل << حكمة .
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 وتثبيتها .. أتمنى أن ننجح هذه المرة .
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
شكراااااااااااااااااااااااااااااااااااااااا
على المساعدة
المشكل الان هو في 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