1. المقدمة:
بالنسبة إلى دلفي، إذا كنت تريد رسم صور، فأنت بحاجة إلى معالجتها أولاً، وتحتاج إلى الرجوع إلى الوحدات الأخرى، التي لم يتم تضمينها في دلفي، لذلك تحتاج إلى تنزيل Gl.pas بشكل منفصل. وحدة OpenGl الشائعة على الإنترنت مغلفة في الإصدار 1.0، ولم يتم الإعلان عن هذه الوظيفة. يمكن العثور على وحدات Gl.pas عبر الإنترنت. بالإضافة إلى ذلك، يلزم وجود وحدة Glux.pas وglaux.dll، وهي مكتبات مساعدة. سيتم توفير التنزيل في نهاية هذه المقالة.
2. عملية التنفيذ:
يتطلب رسم الصور العمليات التالية. يعتمد رسم النافذة على الصور النقطية، مثل png وjpg وما إلى ذلك. عند الرسم، يمكن تحويلها إلى bmp ثم رسمها.
1. قم بتحميل صور bmp: استخدم auxDIBImageLoadA أو وظائف أخرى
2. التحويل إلى نسيج: glGenTextures -> glBindTexture -> glTexImage2D، يتم استخدام glTexParameteri لتعيين المعلمات ذات الصلة
3. رسم الملمس: glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. ارسم باستخدام وظيفة glDrawPixels
يحتوي glDrawPixels على المعلمات الخمس التالية:
العرض: عرض صورة الجدول
height: ارتفاع صورة الجدول
التنسيق: تنسيق تخزين البيانات لصور الجدول
النوع: غير معروف
البكسل: مؤشر لبيانات DIB
رمز العينة كما يلي:
الإجراء TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; / يتم تخزين بيانات صورة TBitmap بشكل مستمر في الذاكرة بترتيب عكسي. يمكن الحصول على العنوان الأول، وهو عنوان المخزن المؤقت للصورة، من خلال TBitmap.ScanLine[TBitmap.Height-1] // لون صورة bmp هو. المخزنة في bgr، لذلك تحتاج إلى تحديد GL_BGR_EXT كمعلمة glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]);
لا تحتاج إلى تمكين تعيين النسيج لرسم الصور باستخدام الطريقة المذكورة أعلاه. يمكنك استخدام وظيفة glPixelZoom لتكبير الصورة. يكون موضع العرض في الزاوية اليسرى السفلية من النافذة (لا أعرف كيفية تغيير الصورة الموقف في الوقت الحاضر.)
3. استخدم رسم الملمس
إذا كنت تريد التحكم في موضع العرض وتكبير/تصغير الصورة، فيمكنك استخدام الطرق التالية.
1. وفقًا لهذه العملية، نقوم أولاً بتحميل الصورة في البرنامج والحصول على معلومات الصورة ذات الصلة .
لتحميل الصور إلى الأنسجة، يرجى الرجوع إلى هذا الموقع://www.VeVB.COm/article/52125.htm
يعد تحميل الصورة النقطية في دلفي أمرًا بسيطًا للغاية ويمكن تحميله بالطرق التالية:
(1) قم بتحميل الصورة من خلال وظيفة auxDIBImageLoadA للمكتبة المساعدة. الإرجاع هو مؤشر بيانات PTAUX_RGBImageRec، وتنسيق بيانات DIB هو RGB.
// بنية بيانات RGB TAUX_RGBImageRec = حجم السجل .bmp')); // كيفية الافراج عن ع؟ لا يمكن لأي من Dispose أو Freemem تشغيل نهاية المؤشر هذه؛
(2) تحميل الصور من خلال TBitmap.LoadFromFile. يأتي دلفي معه من مقارنة الكفاءة، والأداء هو نفس auxDIBImageLoadA، ولكن تنسيق بيانات DIB هو BGR ومؤشر DIB هو TBitmap.ScanLine[Bmp.Height - 1].
var Bmp: TBitmap;begin Bmp := TBitmap.Create;
2. قم بإنشاء نسيج ، بما في ذلك glGenTextures وglBindTexture، في Gl.pas.
// إنشاء منطقة نسيج glGenTextures(1, @texture); // ربط منطقة النسيج glBindTexture(GL_TEXTURE_2D, Texture); // استخدم صورة نقطية لإنشاء نسيج الصورة glTexImage2D( GL_TEXTURE_2D, // النسيج عبارة عن نسيج ثنائي الأبعاد GL_TEXTURE_2D) 0, // مستوى تفاصيل الصورة الافتراضي هو 0 3, // عدد مكونات البيانات لأن الصورة تتكون من الأحمر والأخضر والأزرق، فإن القيمة الافتراضية هي 3 Bmp.Width، // عرض النسيج Bmp.Height، // ارتفاع النسيج هو 0، / / قيمة الحد هي 0 بشكل افتراضي GL_BGR_EXT، // يستخدم تنسيق البيانات bmp bgr GL_UNSIGNED_BYTE، // البيانات التي تتكون منها الصورة هي نوع بايت غير موقع Bmp.ScanLine[Bmp.Height - 1] // بيانات DIB المؤشر)؛ // يتيح السطران التاليان لبرنامج opengl استخدام طريقة التصفية التي يستخدمها OpenGL عند تكبير النسيج الأصلي (GL_TEXTURE_MAG_FILTER) أو تصغير النسيج الأصلي (GL_TEXTURE_MIN_FILTER). // GL_LINEAR يستخدم التصفية الخطية لتسهيل معالجة الصور، لكنه يتطلب المزيد من الذاكرة ووحدة المعالجة المركزية glTexTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // التصفية الخطية glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. ارسم الملمس
قبل رسم نسيج، يجب إخطار OpenGL لتمكين تعيين النسيج glEnable(GL_TEXTURE_2D). عند تشغيله، لن يعمل الرسم غير الملمس. فقط تذكر إغلاقه عند الانتهاء من استخدامه.
// ما يلي هو الرسم باستخدام شكل رباعي لرسم صورة // تمكين تعيين النسيج إذا glIsEnabled(GL_TEXTURE_2D) = 0 ثم glEnable(GL_TEXTURE_2D); // امسح المخزن المؤقت glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT); := 10; ث := 200; تكبير الصورة إلى 200*200 // حدد نسيجًا. إذا تم استخدام مواد متعددة في المشهد، فلا يمكن ربط النسيج بين glBegin() و glEnd() glBindTexture(GL_TEXTURE_2D, Texture); glBegin(GL_QUADS); معلمة glTexCoord2f هي إحداثي X. // 0.0 هو الجانب الأيسر من النسيج. 0.5 هو منتصف النسيج و1.0 هو الجانب الأيمن من النسيج. // المعلمة الثانية لـ glTexCoord2f هي الإحداثي Y. // 0.0 هو الجزء السفلي من النسيج. 0.5 هي نقطة المنتصف للنسيج و1.0 هي الجزء العلوي من النسيج. glTexCoord2f(0, 1); glVertex2f(1, 1); 0, 0); glEnd();
انتهى الرسم أعلاه، وفيما يلي الكود الكامل الموجود في Draw، ولا تحتاج إلى الرجوع إلى المكتبة المساعدة Glux.pas.
الإجراء TForm1.Draw;var Bmp: TBitmap; الملمس: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create; / إنشاء منطقة نسيج glGenTextures(1, @texture); ربط منطقة النسيج glBindTexture(GL_TEXTURE_2D, Texture); // استخدم صورة نقطية لإنشاء نسيج صورة glTexImage2D( GL_TEXTURE_2D, // النسيج عبارة عن نسيج ثنائي الأبعاد GL_TEXTURE_2D 0, // مستوى التفاصيل الافتراضي للصورة هو 0 3, / / عدد مكونات البيانات لأن الصورة مكونة من اللون الأحمر والأخضر والأزرق، فإن القيمة الافتراضية هي 3 Bmp.Width، // عرض النسيج Bmp.Height، // ارتفاع النسيج هو 0، // قيمة الحدود الافتراضية هي 0 GL_BGR_EXT، // يستخدم تنسيق البيانات bmp bgr GL_UNSIGNED_BYTE، // البيانات التي تتكون منها الصورة هو نوع البايت غير الموقع Bmp.ScanLine[Bmp .Height - 1] // مؤشر بيانات DIB)؛ يتيح السطران التاليان لبرنامج opengl استخدام طريقة التصفية التي يستخدمها OpenGL عند تكبير النسيج الأصلي (GL_TEXTURE_MAG_FILTER) أو تصغير النسيج الأصلي (GL_TEXTURE_MIN_FILTER). // GL_LINEAR يستخدم التصفية الخطية لتسهيل معالجة الصور، لكنه يتطلب المزيد من الذاكرة ووحدة المعالجة المركزية glTexTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // التصفية الخطية glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); ما يلي هو الرسم باستخدام شكل رباعي لرسم صورة // تمكين تعيين النسيج إذا كان glIsEnabled(GL_TEXTURE_2D) = 0 ثم glEnable(GL_TEXTURE_2D); // امسح المخزن المؤقت glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT); 10؛ ث:= 200؛ تكبير الصورة إلى 200*200 // حدد نسيجًا. إذا تم استخدام مواد متعددة في المشهد، فلا يمكن ربط النسيج بين glBegin() و glEnd() glBindTexture(GL_TEXTURE_2D, Texture); glBegin(GL_QUADS); معلمة glTexCoord2f هي إحداثي X. // 0.0 هو الجانب الأيسر من النسيج. 0.5 هو منتصف النسيج و1.0 هو الجانب الأيمن من النسيج. // المعلمة الثانية لـ glTexCoord2f هي الإحداثي Y. // 0.0 هو الجزء السفلي من النسيج. 0.5 هي نقطة المنتصف للنسيج و1.0 هي الجزء العلوي من النسيج. glTexCoord2f(0, 1); glVertex2f(1, 1); 0, 0); glEnd(); Bmp.Free;
يمكن تنزيل الكود الكامل لهذا المثال هنا.