{
يمكن للقوام توفير وقت وحدة المعالجة المركزية بشكل كبير. هههه بس هذا المقطع اخذ مني وقت كبير :(
نظرًا لاستخدام مكتبة OpenGL المساعدة، يستخدم عدد قليل من الأشخاص وظائف هذه المكتبة الآن، لكنني ما زلت أجدها بفضل zdcnow (التأثير المغناطيسي)، فقد زودني بإصدار دلفي من هذه المكتبة المساعدة. قبل دراسة هذا القسم، يرجى تنزيل ملفات glau.dll وGlux.pas عبر الإنترنت وإضافتها إلى المشروع.
حسنًا، فلنواصل السير على طريق OPENGL.
نحتاج أولاً إلى إضافة وحدة SysUtils، لأننا سنستخدم عمليات الملفات في هذا القسم، ونحتاج أيضًا إلى إضافة وحدة Glux.
ثم نضيف عدة متغيرات وهي xrot و yrot و zrot بناء على الدرس الأول. تُستخدم هذه المتغيرات لتدوير المكعب حول المحاور X وY وZ. الملمس [] يخصص مساحة تخزين للملمس. إذا كنت بحاجة إلى أكثر من نسيج واحد، فيجب عليك تغيير الرقم 1 إلى الرقم الذي تحتاجه.
}
حكم الفيديو المساعد
h_RC: HGLRC؛ // سياق العرض (جدول وصف التظليل).
h_DC: HDC // سياق الجهاز (جدول وصف الجهاز)
h_Wnd: HWND؛ // مقبض النافذة
h_Instance: HINST; // مثيل البرنامج (مثيل).
المفاتيح: صفيف [0..255] منطقي؛ // صفيف لإجراءات لوحة المفاتيح
xrot، // مقدار دوران X (جديد)
yrot، // مقدار الدوران Y (جديد)
zrot : GLfloat؛ // مقدار الدوران Z (جديد)
الملمس: صفيف [0..1] من GLuint؛ // تخزين الملمس (جديد)
{ثم قم بتحميل العمليتين في opengl32.dll، نحتاج إلى استخدامهما}
PROcedure glGenTextures(n: GLsizei; var contexts: GLuint);
opengl32;
الإجراء glBindTexture(target: GLenum;texture: GLuint);
opengl32;
{بعد ذلك، نحتاج إلى إضافة وظيفة جديدة لإعادة إدخال الصورة. يتم تعريف نوع الإرجاع لهذه الوظيفة في Glux.pas على النحو التالي:
TAUX_RGBImageRec= سجل
sizeX، sizeY: GLint؛
البيانات: المؤشر؛
نهاية؛
PTAUX_RGBImageRec= ^TAUX_RGBImageRec;
سيتم تقديم المعنى المحدد لاحقًا }
الوظيفة LoadBmp(اسم الملف: pchar): PTAUX_RGBImageRec;
فار
BitmapFile: Thandle؛
يبدأ
// تحقق بعد ذلك من توفير اسم الملف
إذا كان اسم الملف = ''، فتأكد من توفير اسم الملف.
النتيجة := لا شيء // إذا لم يتم توفيره، قم بإرجاع NULL
// ثم تحقق من وجود الملف.
BitmapFile := FileOpen(Filename, fmOpenWrite); // حاول فتح الملف
// إذا تمكنا من فتح الملف، فمن الواضح أن الملف موجود.
إذا كان BitmapFile > 0 إذن // هل الملف موجود؟
يبدأ
//أغلق الملف.
FileClose(BitmapFile); // إغلاق المقبض
//auxDIBImageLoad(اسم الملف) يقرأ بيانات الصورة ويعيدها.
النتيجة := auxDIBImageLoadA(filename); // قم بتحميل الصورة النقطية وأرجع المؤشر
نهاية
آخر
// إذا لم نتمكن من فتح الملف، فسنعيد NiL.
النتيجة:= لا شيء // إذا فشل التحميل، قم بإرجاع NiL.
نهاية؛
// بعد ذلك قم بإنشاء وظيفة جديدة لتحميل خريطة النسيج
وظيفة LoadTexture: منطقية؛
// متغير الحالة. نستخدم هذا لتتبع ما إذا كان من الممكن تحميل الصورة النقطية وما إذا كان من الممكن إنشاء النسيج.
// يتم تعيين الحالة على FALSE افتراضيًا (مما يشير إلى عدم تحميل أو إنشاء أي شيء).
// يقوم متغير TextureImage بتخزين نوع PTAUX_RGBImageRec سجل الصورة النقطية.
// يحتوي هذا السجل على عرض الصورة النقطية وارتفاعها وبياناتها.
فار
الحالة: منطقية؛
TextureImage : Array[0..1] Of PTAUX_RGBImageRec;
يبدأ
الحالة := خطأ؛
ZeroMemory(@TextureImage, sizeof(TextureImage)); // اضبط المؤشر على NULL
TextureImage[0] := LoadBMP('Texture.bmp');
إذا TextureImage[0] <> Nil إذن
يبدأ
الحالة := TRUE؛ // اضبط الحالة على TRUE
// استخدم الآن البيانات الموجودة في TextureImage[0] لإنشاء نسيج.
// glGenTextures(1, Texture[0]) يخبر OpenGL أننا نريد إنشاء اسم نسيج
//(إذا كنت تريد تحميل مواد متعددة، قم بزيادة العدد).
// glBindTexture(GL_TEXTURE_2D, الملمس[0]) يخبر OpenGL بربط اسم الملمس الملمس[0] بهدف الملمس.
// القوام ثنائي الأبعاد له ارتفاع (على المحور Y) وعرض (على المحور X) فقط.
// تقوم الوظيفة الرئيسية بتعيين اسم النسيج لبيانات النسيج.
// في هذا المثال، نخبر OpenGL أن الذاكرة الموجودة في &texture[0] متاحة.
// سيتم تخزين النسيج الذي نقوم بإنشائه في منطقة الذاكرة المشار إليها بواسطة &texture[0].
glGenTextures(1, الملمس[0]); // إنشاء نسيج
glBindTexture(GL_TEXTURE_2D, الملمس[0]); // استخدم نسيجًا نموذجيًا تم إنشاؤه من بيانات الصورة النقطية
// للأسفل نقوم بإنشاء الملمس الحقيقي.
// يخبر السطر التالي OpenGL أن هذا النسيج عبارة عن نسيج ثنائي الأبعاد (GL_TEXTURE_2D).
// يمثل الرقم صفر مستوى تفاصيل الصورة، والذي يُترك عادةً عند الصفر.
// الرقم ثلاثة هو عدد مكونات البيانات. لأن الصورة تتكون من ثلاثة مكونات: البيانات الحمراء، والبيانات الخضراء، والبيانات الزرقاء.
//TextureImage[0].sizeX هو عرض النسيج.
// إذا كنت تعرف العرض، فيمكنك ملؤه هنا، ولكن يمكن للكمبيوتر اكتشاف ذلك بسهولة لك.
// TextureImage[0].sizey هو ارتفاع النسيج.
// الرقم صفر هو قيمة الحد، وعادةً ما يكون صفرًا.
// GL_RGB يخبر OpenGL أن بيانات الصورة تتكون من بيانات ملونة باللون الأحمر والأخضر والأزرق.
//GL_UNSIGNED_BYTE يعني أن البيانات التي تتكون منها الصورة هي من نوع بايت غير موقع.
//أخيرًا... TextureImage[0].data تخبر OpenGL بمصدر بيانات النسيج.
// يشير هذا المثال إلى البيانات المخزنة في سجل TextureImage[0].
// توليد الملمس
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0].sizeX,
TextureImage[0].sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE,
TextureImage[0].data);
// يخبر السطران التاليان برنامج OpenGL عند عرض الصورة،
// عندما يكون أكبر من النسيج الأصلي الموسع (GL_TEXTURE_MAG_FILTER)
// أو طريقة التصفية التي يستخدمها OpenGL عندما يتم تقليل النسيج إلى حجم أصغر من النسيج الأصلي (GL_TEXTURE_MIN_FILTER).
// عادةً ما أستخدم GL_LINEAR في كلتا الحالتين. وهذا يسمح للأنسجة بالظهور بسلاسة من مسافة بعيدة إلى قريبة جدًا من الشاشة.
// يتطلب استخدام GL_LINEAR وحدة المعالجة المركزية وبطاقة الرسومات لإجراء المزيد من العمليات.
// إذا كان جهازك بطيئا، فمن المحتمل أن تستخدم GL_NEAREST.
// عندما يتم تكبير النسيج الذي تمت تصفيته، يبدو فسيفساء للغاية (فسيفساء).
// يمكنك أيضًا الجمع بين طريقتي التصفية. استخدم GL_LINEAR عندما تكون قريبًا وGL_NEAREST عندما تكون بعيدًا.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // التصفية الخطية
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
نهاية؛
// الآن نقوم بتحرير الذاكرة المستخدمة سابقًا لتخزين بيانات الصورة النقطية.
// نتحقق أولاً مما إذا كانت بيانات الصورة النقطية مخزنة في.
//إذا كان الأمر كذلك، فتحقق من تخزين البيانات.
// إذا تم تخزينه، فاحذفه.
// ثم حرر بنية الصورة TextureImage[0] للتأكد من إمكانية تحرير كل الذاكرة.
إذا تم تعيينه (TextureImage[0]) ثم // ما إذا كان النسيج موجودًا أم لا
إذا تم تعيينه (TextureImage[0].data) ثم // ما إذا كانت صورة النسيج موجودة أم لا
TextureImage[0].data := Nil; // حرر الذاكرة التي تشغلها صورة النسيج
TextureImage[0] := Nil; // حرر بنية الصورة
// أخيرًا قم بإرجاع متغير الحالة. إذا كان كل شيء على ما يرام، فإن المتغير Status له القيمة TRUE. خلاف ذلك خطأ
النتيجة: = الحالة // حالة العودة
نهاية؛