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

إكساء مجسم بواسطة Devil + Glut

بدأه crazy Programm2007er في 29 أغسطس 2009 · 8 رد · 2,085 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

كيف أستطيع إكساء مجسم بإستخدام glut و DivIL لأني بصراحة بحثت في المنتدى ولم أجد ما أريده

أريد فقط مثال بسيط: مكعب أو كرة أو إبريق شاء يتم إكسائه فقط

وشكرا

#2

السلام عليكم

الاكساء او ال texture لايتم بأستخدام glut لان هذه المكتبه مخصصه لانشاء شاشه العرض .

الان سوف أريك مثال بسيط على الاكساء

GLuint YourTexture;
glGenTextures(1,&YourTexture); // Obtain an unused texture object identifier

هكذا تبداء بعمل object للاكساء وهو YourTextureاو اي اسم تختاره

ثانياً :

تحدد نوع الاكساء 2D او 3D او .....

glBindTexture(GL_TEXTURE_2D,YourTexture);// create a texture object using

ثالثاً :

تحدد صوره الاكساء ونفترض انها موجوده على C drive

image = auxDIBImageLoad(L"c:\\1.bmp");//texturing image
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,GL_RGB,
GL_UNSIGNED_BYTE, image->data );//use the image for texturing

رابعاً :

قبل بدايه الرسم نفعل الاكساء وكذالك نحدد الاكساء الذي نريده (اذا صنعت اكثر من واحد)

glEnable(GL_TEXTURE_2D);//to Enable the Texturing
glBindTexture(GL_TEXTURE_2D,YourTexture);/*to enable the texture
before the object you want.*/

الان اذا كان الجسم الذي تريد عمل texture له ذو وجوه مربعه فيمكن ان تعمل على تحديد ابعاد الاكساء اي ان الصوره بنفس حجم المربع او اكبر او اصغر .

void CALLBACK movie(){
glRotated(1,0,x++,0);
glRotated(1,0,0,x);
glRotated(1,x,0,0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBindTexture(GL_TEXTURE_2D,YourTexture);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(300,300, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(500,300, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(500,500, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(300,500, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(300,300, 200);
glTexCoord2f(0.0, 1.0); glVertex3f(500,300, 200);
glTexCoord2f(1.0, 1.0); glVertex3f(500,500, 200);
glTexCoord2f(1.0, 0.0); glVertex3f(300,500, 200);
glTexCoord2f(0.0, 0.0); glVertex3f(300,500, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(500,500, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(500,500, 200);
glTexCoord2f(1.0, 0.0); glVertex3f(300,500, 200);
glTexCoord2f(0.0, 0.0); glVertex3f(300,300, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(500,300, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(500,300, 200);
glTexCoord2f(1.0, 0.0); glVertex3f(300,300, 200);
glEnd();
auxSwapBuffers();
}

post-210374-1251806162_thumb.jpg

اما اذا كان كره او ابريق او غير ذالك

glBindTexture(GL_TEXTURE_2D,YourTexture);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_T);
auxSolidSphere(100);

post-210374-1251806280_thumb.jpg

الموضوع طويل ولكنه سهل واذا استطعت تعلم هذه الاكسائات فانك ستتكلم جميع الانواع بسهوله .

وشكراً.

تم تعديل هذه المشاركة بواسطة Ali Al-Zyoud في 1 سبتمبر 2009 في 23:02

#3

أخي الفاضل :Ali Al-Zyoud شكر جزيلاَ علي الشرح الوافي لأني أواجه مشاكل مشابه,

ولكن عندي سؤال هل يكمن أستخدام صورة للأكساء بأمداد غير أمداد bmp?

#4

حسب معرفتي فأنه عند التغليف يجب ان تكون الصوره bitmap ولكن هنالك العديد من المكتبات القادره على تحويل صيغ ال jpg مثلاً الى bitmap يمكن استخدامها

#5

على العموم .. باستخدام DevIL , يمكن تحميل العديد من الانواع من الصور .. ويمكن بعدها تطبيق الاكساء كما وصحه الاخ علي .

اسف للتأخر في وضع مثال .. سأحاول وضع المثال في القريب العاجل .

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

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

أنا أريد إستخدام المكتبة DivIL في تحميل الصور (jpg,tga,png,dds)

أنا أعلم اطريقة التقليدية في الـOpenGL لكنها تحمل فقط ملفات bmp

أرجو أن تفهموني

#7

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

هذا مثال بسيط لتحميل صورة من نوع png باستخدام DevIL و glut .

طبعاً .. يجب تثبيت المكتبة لديك .. اذا كنت تعمل على Visual c++ 2008 . . سيعمل معك ان شاء الله , والا فانك بحاجة الى ربط المكتبات بطريقة سليمة .

 
#   pragma comment (lib, "DevIL.lib")	
#   pragma comment (lib, "ILU.lib")		
#   pragma comment (lib, "ILUT.lib")	  
 
#include "windows.h" 
#include <gl/glut.h>
#include <IL/il.h>
#include <IL/ilu.h>
#include <IL/ilut.h>
 
 
unsigned int textureID;
void initialzeDevil()
{
	// call these functions to init DevIL
	ilInit();
	iluInit();
	ilutRenderer(ILUT_OPENGL); 
}
void createTexture()
{
unsigned int imageID;
	// original point of any Image in OpenGL is left bottom .. so convert the original point to left bottom
	ilEnable(IL_ORIGIN_SET); 
	ilSetInteger(IL_ORIGIN_MODE, IL_ORIGIN_LOWER_LEFT); 
	ilGenImages ( 1 ,&imageID );
	ilBindImage (imageID );
	ilLoadImage("image.png");
	// Convert the Image to be compatible with OpenGL Texture Format
	ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE); 
 
 
	// Get image Info that will be used to create openGL texture .
	int width = ilGetInteger(IL_IMAGE_WIDTH);
	int height = ilGetInteger(IL_IMAGE_HEIGHT);
 
	glGenTextures(1,&textureID);
	glBindTexture(GL_TEXTURE_2D,textureID);
	gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,height,ilGetInteger(IL_IMAGE_FORMAT),ilGetInteger(IL_IMAGE_TYPE),ilGetData());
	glEnable(GL_TEXTURE_2D);
 
	// Now .. there is no need to keep image data.
	ilDeleteImage(imageID);
 
}
 
void reshape(int w,int h)
{
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-w/2.0f,w/2.0f,-h/2.0f,h/2.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
 
void display()
{
	glClearColor(0.2,0.2,0.2,1);
	glClear(GL_COLOR_BUFFER_BIT);
	glBindTexture(GL_TEXTURE_2D,textureID);
	glBegin(GL_QUADS);
 
		glTexCoord2f(0,0);
		glVertex2f(-200,-200); // left bottom
 
		glTexCoord2f(1,0);
		glVertex2f(200,-200); // right bottom
 
		glTexCoord2f(1,1);
		glVertex2f(200,200); // right top
 
		glTexCoord2f(0,1);
		glVertex2f(-200,200); // left top
 
	glEnd();
 
	glutSwapBuffers();
}
int main(int argc, char** argv)
{
	// GLUT Window Initialization:
	glutInit (&argc, argv);
	glutInitWindowSize (600,400);
	glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE );
	glutCreateWindow ("DevIL with GLUT Example");
 
	initialzeDevil();
	createTexture();
 
 
	glutDisplayFunc (display);
	glutReshapeFunc (reshape);
 
	glutMainLoop ();
	return 0;
}

Devil_GLUT.zip

تم تعديل هذه المشاركة بواسطة الشمري في 3 سبتمبر 2009 في 07:40

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

شكرا جزيلا أخ الشمري هذا هو الذي أريده

تم تعديل هذه المشاركة بواسطة crazy Programm2007er في 3 سبتمبر 2009 في 16:36

#9

جزاك الله خيراً أخي:- الشمري علي هذا الشرح الرائع. 

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