برمجة الرسومات OPENGL
OPENGL عبارة عن مكتبة نماذج ورسومات ثلاثية الأبعاد نظرًا لأدائها المتميز في الرسومات ثلاثية الأبعاد، توفر العديد من اللغات عالية المستوى حاليًا واجهات مع OPENGL، مثل: VC وDELPHI وC++Builder وما إلى ذلك. يمكن أن يؤدي استخدام OPENGL إلى تقليل الصعوبة التي يواجهها المستخدمون في تطوير الرسومات والصور بشكل كبير، مما يسمح للمستخدمين بإنتاج إعلانات تجارية عالية المستوى، ورسومات CAD، ورسوم متحركة ثلاثية الأبعاد، ومحاكاة رسومية، ومجموعة أفلام وتلفزيون.
1. وظائف OPENGL
كانت OPENGL في الأصل مكتبة برامج رسومية على محطات العمل نظرًا لتطبيقها الواسع في المجالات التجارية والعسكرية والطبية والفضاءية وغيرها من المجالات، يمكن الآن تطوير الرسومات التي تلبي متطلبات المستخدم على أجهزة الكمبيوتر المنخفضة. لا يستطيع OPENGL رسم الصور الأساسية فحسب، بل يوفر أيضًا عددًا كبيرًا من الوظائف والإجراءات لمعالجة الصور الرسومية.
1. التحول الرسومي
إنه أساس العرض الرسومي والإنتاج. لا يمكن فصل تصميم الرسوم المتحركة وعرض الرسوم المتحركة عن التحويل الرسومي. ويتحقق التحويل الرسومي رياضيًا من خلال مضاعفة المستطيلات. يتضمن التحويل عمومًا الترجمة والتدوير والقياس. وفقًا لخصائص عرض الرسومات: تحويل وجهة النظر، وتحويل النموذج، وتحويل الإسقاط، وتحويل القطع، وتحويل إطار العرض، وما إلى ذلك.
2. تأثير الإضاءة
إن لون الجسم غير المضيء ينتج عن انعكاس الجسم للضوء الخارجي، وهو الإضاءة. في الرسومات ثلاثية الأبعاد، إذا تم استخدام الإضاءة بشكل غير صحيح، فستفقد الرسومات ثلاثية الأبعاد معناها الحقيقي ثلاثي الأبعاد. يقسم OPENGL الإضاءة إلى: الضوء المشع، والضوء المحيط، والضوء المتناثر، والضوء المنعكس، وما إلى ذلك.
3. رسم خرائط الملمس
يتيح لك رسم خرائط النسيج إضافة مواد حقيقية إلى الأسطح ثلاثية الأبعاد. على سبيل المثال: لا يمكن للمستطيل أن يمثل كائنًا في العالم الحقيقي، إذا كان مليئًا بالملمس "الأساسي"، فسوف يصبح واقعيًا.
4. المؤثرات الرسومية الخاصة
يمكن لوظيفة المزج ووظيفة منع التعرج ووظيفة الضباب التعامل مع شفافية وشفافية الرسومات ثلاثية الأبعاد، والسماح للكائن بأن يكون سلسًا، واستخدام أجزاء الخط للتنعيم، وتوفير تأثير الضباب.
5. المؤثرات الخاصة للصورة
الوظائف الأساسية لمعالجة الصور النقطية: رسم الصور، ونسخ الصور وتخزينها، ورسم الخرائط ونقلها، وقياس الصور، وما إلى ذلك. يمكن لوظيفة تشغيل الصورة النقطية أن توضح عملية تكوين الأحرف الصينية في المستوى الأدنى من الرسم الأصلي.
2. إنشاء تطبيق OPENGL
1. المبادئ العامة
أ. أضف وحدة دعم OPENGL في الاستخدامات: OpenGL؛
ب تهيئة OPENGL أثناء حدث OnCreate الخاص بالنموذج؛
يقوم C بتهيئة OPENGL أثناء حدث OnPaing الخاص بالنافذة؛
يقوم D بتهيئة OPENGL أثناء حدث OnResize الخاص بالنافذة؛
يقوم E بتهيئة OPENGL أثناء حدث OnDestroy الخاص بالنافذة؛
2. مثال بسيط
أ قم بإنشاء ملف المشروع->تطبيق جديد
ب أضف التعليمات البرمجية في حدث OnCreate:
PROcedure TfrmMain.FormCreate(Sender: TObject);
فار
pfd:TPixelFormatDescriptor; //تعيين جدول الوصف
تنسيق البكسل: عدد صحيح؛
يبدأ
ControlStyle:=ControlStyle+[csOpaque];
fillChar(pfd,sizeof(pfd),0);
مع قوات الدفاع الشعبي القيام به
يبدأ
nSize:=sizeof(TPixelFormatDescriptor);
nVersion:=1;
dwFlags:=PFD_DRAW_TO_WINDOW أو
PFD_SUPPORT_OPENGL أو PFD_DOUBLEBUFFER؛
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
نهاية؛
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientWidth;
h:=ClientHeight;
نهاية؛
رمز C في حدث OnDestroy
إجراء TfrmMain.FormDestroy(Sender: TObject);
يبدأ
wglDeleteContext(hrc);
نهاية؛
كود D في حدث OnPaint
إجراء TfrmMain.FormPaint(Sender: TObject);
يبدأ
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
MyDraw;
glFlush;
SwapBuffers(Canvas.Handle);
نهاية؛
الكود الإلكتروني في حدث OnResize
الإجراء TfrmMain.FormResize(Sender: TObject);
يبدأ
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
MyDraw;
نهاية؛
رمز F في وظيفة MyDraw (المعلن عنه من قبل المستخدم في فئة النافذة)
الإجراء TfrmMain.MyDraw؛
يبدأ
glPushMatrix;
Sphere:=gluNewQuadric;
gluQuadricDrawStyle(Sphere,GLU_LINE);
gluSphere(Sphere,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(Sphere);
نهاية؛
ومرفق الكود الأصلي لهذا البرنامج:
وحدة MainFrm؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
الحوارات، برنامج OpenGL؛
يكتب
TfrmMain = فئة (TForm)
الإجراء FormCreate(Sender: TObject);
إجراء FormDestroy(Sender: TObject);
الإجراء FormPaint(Sender: TObject);
إجراء FormResize(Sender: TObject);
خاص
{تصريحات خاصة}
hrc:HGLRC;
w,h:glFloat;
المجال:GLUquadricObj;
عام
{التصريحات العامة}
الإجراء MyDraw؛
نهاية؛
فار
frmMain: TfrmMain;
تطبيق
{$R *.dfm}
إجراء TfrmMain.FormCreate(Sender: TObject);
فار
pfd:TPixelFormatDescriptor;
تنسيق البكسل: عدد صحيح؛
يبدأ
ControlStyle:=ControlStyle+[csOpaque];
fillChar(pfd,sizeof(pfd),0);
مع قوات الدفاع الشعبي القيام به
يبدأ
nSize:=sizeof(TPixelFormatDescriptor);
nVersion:=1;
dwFlags:=PFD_DRAW_TO_WINDOW أو
PFD_SUPPORT_OPENGL أو PFD_DOUBLEBUFFER؛
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
نهاية؛
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientWidth;
h:=ClientHeight;
نهاية؛
إجراء TfrmMain.FormDestroy(Sender: TObject);
يبدأ
wglDeleteContext(hrc);
نهاية؛
إجراء TfrmMain.FormPaint(Sender: TObject);
يبدأ
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
MyDraw;
glFlush;
SwapBuffers(Canvas.Handle);
نهاية؛
الإجراء TfrmMain.MyDraw؛
يبدأ
glPushMatrix;
Sphere:=gluNewQuadric;
gluQuadricDrawStyle(Sphere,GLU_LINE);
gluSphere(Sphere,0.5,25,25);
glPopMatrix;
SwapBuffers(Canvas.handle);
gluDeleteQuadric(Sphere);
نهاية؛
الإجراء TfrmMain.FormResize(Sender: TObject);
يبدأ
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,ClientWidth,ClientHeight);
MyDraw;
نهاية؛
نهاية.
3. اتفاقيات حول متغيرات ووظائف OPENGL
1. اتفاقيات مكتبة OPENGL
تحتوي على ثلاث مكتبات إجمالاً: المكتبة الأساسية، والمكتبة العملية، والمكتبة المساعدة. في DELPHI، يتم تنفيذ المكتبة الأساسية بواسطة وحدة OpenGL. في بيئة Windows، لا يتم استخدام المكتبات المساعدة بشكل عام.
2. اتفاقية OPENGL الثابتة
تستخدم ثوابت OPENGL الحروف الكبيرة، بدءًا من "GL"، وتستخدم الشرطة السفلية للفصل بين الكلمات، مثل: GL_LINES، وهو ما يعني استخدام المكتبة الأساسية لرسم خطوط مستقيمة.
3. اصطلاح تسمية وظائف OPENGL
A الجزء الأول يبدأ بـ gl أو wgl، مثل gl في glColor3f.
ب الجزء الثاني هو الوظيفة المعبر عنها باللغة الإنجليزية، مع كتابة الحرف الأول من الكلمة بالأحرف الكبيرة.
الجزء الثالث من لغة C هو رقم يمثل معلمات الوظيفة.
الجزء الرابع من D عبارة عن حرف صغير يشير إلى نوع الوظيفة.
عدد صحيح b9 بت
عدد صحيح s16 بت
عدد صحيح i32 بت
رقم الفاصلة العائمة f32 بت
رقم الفاصلة العائمة d64 بت
ub9 بت عدد صحيح غير موقعة
مثال: glVertex2f(37,40); {رقمان عائمان 32 بت كمعلمات}
glVertex3d(37,40,5); {ثلاثة أرقام الفاصلة العائمة 64 بت كمعلمات}
ص[1..3]:صفيف glFloat؛
glVertes3fv(p); {3f يمثل ثلاثة أرقام الفاصلة العائمة، ويمثل v استدعاء مصفوفة كمدخل إحداثي قمة الرأس}
4. تهيئة OPENGL
1. هيكل PIXELFORMATDESCRIPTOR
وهو يصف بشكل أساسي خصائص البكسلات، مثل وضع الألوان للبكسلات وتكوين الألوان الأحمر والأخضر والأزرق.
tagPIXELFORMATDESCRIPTOR = سجل معبأ
الحجم: كلمة؛
nالإصدار: كلمة؛
dwFlags: DWORD؛
iPixelType: بايت؛
cColorBits: بايت؛
كريدبيتس: بايت؛
cRedShift: بايت؛
cGreenBits: بايت؛
cGreenShift: بايت؛
cBlueBits: بايت؛
cBlueShift: بايت؛
cAlphaBits: بايت؛
cAlphaShift: بايت؛
cAccumBits: بايت؛
cAccumRedBits: بايت؛
cAccumGreenBits: بايت؛
cAccumBlueBits: بايت؛
cAccumAlphaBits: بايت؛
cDepthBits: بايت؛
cStencilBits: بايت؛
cAuxBuffers: بايت؛
iLayerType: بايت؛
ب محجوز: بايت؛
dwLayerMask: DWORD؛
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
نهاية؛
TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
تمثل dwFlags سمات تنسيق النقطة:
يتم رسم رسومات PFD_DRAW_TO_WINDOW على الشاشة أو سطح الجهاز
يقوم PFD_DRAW_TO_BITMAP برسم صورة نقطية في الذاكرة
يدعم PFD_SUPPORT_GDI رسم GDI
يدعم PFD_SUPPORT_OPENGL وظائف OPENGL
يستخدم PFD_DOUBLEBUFFER التخزين المؤقت المزدوج
ذاكرة تخزين مؤقت استريو PFD_STEREO
يستخدم PFD_NEED_PALLETTE لوحة ألوان RGBA
يحدد PFD_GENERIC_FORMAT تنسيق الرسم الذي يدعمه GDI
يستخدم PFD_NEED_SYSTEM_PALETTE لوحة الأجهزة المدعومة من OPENGL
يقوم iPixelType بتعيين وضع لون البكسل: PFD_TYPE_RGBA أو PFD_TYPE_INDEX..
يقوم cColorBits بتعيين بتات الألوان إذا كانت 9، فهذا يعني أن هناك 256 لونًا لتمثيل لون النقطة.
cRedBits، وcGreenBits، وcBlueBits عند استخدام RGBA، يتم تحديد عدد البتات المستخدمة في الألوان الأساسية الثلاثة.
cRedShitfs، cGreenShifts، cBlueShifts عند استخدام RGBA، عدد الأرقام التي يمكن ضبطها للألوان الأساسية الثلاثة.
cAlphaBits، cAlphaShifts عند استخدام RGBA، يتم تحديد عدد البتات التي يستخدمها Alpha وعدد البتات القابلة للتعديل.
يقوم cAccumBits بتعيين العدد الإجمالي للبتات في منطقة المخزن المؤقت للتراكم.
يقوم كل من cAccumRedBits وcAccumGreenBits وcAccumBlueBits بتعيين العدد الإجمالي لثلاث مستويات ألوان أساسية في منطقة المخزن المؤقت للتراكم.
يقوم cAccumAlphaBits بتعيين العدد الإجمالي لبتات Alpha في المخزن المؤقت للتراكم.
يقوم cDepthBits بتعيين عمق المخزن المؤقت للتركيز.
يقوم cStencilBits بتعيين عمق المخزن المؤقت لـ Stencil.
يشير cAuxBuffers إلى حجم المخزن المؤقت المساعد.
يحدد iLayerType نوع الطبقة.
ب-لا يتم استخدام المحجوز ويجب أن يكون صفراً.
يحدد dwLayerMask قناع التراكب.
يقوم dwDamageMask بتعيين ما إذا كان سيتم مشاركة نفس وضع البكسل في نفس ذاكرة التخزين المؤقت للإطار.
2. خطوات تهيئة OPENGL
استخدم Canvas.Handle للحصول على مقبض النافذة.
ب قم بإنشاء متغير TPixelFormatDescriptor لتحديد تنسيق البكسل.
C استخدم وظيفة ChoosePixelFormat لتحديد تنسيق البكسل.
D استخدم وظيفة SetPixelFormat لاستخدام تنسيق البكسل ليصبح نافذ المفعول.
استخدم الدالة wglCreateContext لإنشاء جدول وصف الترجمة.
F استخدم الدالة wglMakeCurrent لاستخدام جدول وصف الترجمة الذي تم إنشاؤه كجدول وصف الترجمة الحالي.
3. إطلاق الموارد
استخدم الإجراء wglDeleteContext لحذف جدول سياق البكسل.
ب استخدم إجراء ReleaseDC لتحرير ذاكرة النافذة.
في حدث OnDestroy الخاص بالنافذة:
يبدأ
إذا hrc<>فارغة إذن
wglDeleteCurrent(hrc);
إذا hdc<>فارغة ثم
ReleaseDC(Handle,hdc);
نهاية؛
5. رسم رسومات OPENGL الأساسية
1. لون الرسومات
انتبه إلى إعداد لون الخلفية يرتبط إعداد اللون عادةً بمتغير وصف البكسل، أي بالعضو iPixelType في تعريف TPixelFormatDescriptor.
iPixelType:=PFD_TYPE_COLORINDEX;
ثم يمكنك فقط استخدام إجراءات glIndexd، وglIndexf، وglIndexi، وglIndexs، وglIndexv، وglIndexfv، وglIndexiv، وglIndexsv لتعيين لون الرسومات.
iPixelType:=PFD_TYPE_RGBA;
ثم يمكنك فقط استخدام glColor3b، glColor3f، glColor4b، glColor4f، glColor4fv لتعيين لون الرسومات.
لون خلفية الرسومات: لون الشاشة والنافذة، أي لون المخزن المؤقت للألوان. لتغيير لون خلفية الرسومات، يجب عليك أولاً استخدام الإجراء glClearColor لتعيين لون الخلفية، ثم استخدام الإجراء glClear لتحديث النافذة والشاشة باستخدام لون الخلفية هذا.
الإجراء glClearColor(red:GLClampf,green:GLClampf,blue:GLClampf,alpha:GLClampf);
الإجراء glClear(mask:GLBitField);
الأحمر، الأخضر، الأزرق، وألفا هي ألوان الخلفية التي سيتم تعيينها، وقيمها من 0 إلى 1. القناع هو وسيلة لتحديث لون الخلفية.
مثال: اضبط نافذة التلوين على اللون الأخضر
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
قيمة ومعنى القناع:
يقوم GL_COLOR_BUFFER_BIT بتعيين مخزن الألوان المؤقت الحالي
يقوم GL_DEPTH_BUFFER_BIT بتعيين المخزن المؤقت للعمق الحالي
يقوم GL_ACCUM_BUFFER_BIT بتعيين المخزن المؤقت للتراكم الحالي
يقوم GL_STENCIL_BUFFER_BIT بتعيين المخزن المؤقت الحالي لـ STENCIL (القالب).
تم ضبط نافذة الرسم على اللون الرمادي
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
ب لون الرسم
استخدم glClear3f وglClear4f لتعيين لون رسم الرسومات. إذا تم استخدام ثلاثة معلمات، فهذا يعني ضبط الألوان الثلاثة للضوء الأحمر والأزرق والأخضر على التوالي. إذا تم استخدام أربع معلمات، فإن المعلم الرابع يمثل قيمة RGBA.
مثال لتعيين لون الرسم الحالي إلى اللون الأزرق:
glColor3f(0,0,1);
اضبط لون المؤامرة على اللون الأبيض:
glColor3f(1,1,1);
2. رسم رسومات بسيطة
ارسم رسومات بسيطة، مثل النقاط والخطوط والمضلعات وما إلى ذلك، بين إجراءات glBegin وglEnd.
glBegin(mode:Glenum);{عملية الرسم}glEnd;
قيمة الوضع:
GL_POINTS يرسم نقاطًا متعددة
GL_LINES يرسم خطوطًا متعددة، ويرسم خطًا مستقيمًا كل نقطتين
GL_LINE_STRIP يرسم خطوطًا متعددة
GL_LINE_LOOP يرسم مضلعات مغلقة متصلة من طرف إلى طرف
GL_TRIANGLES يرسم المثلثات
GL_TRIANGLE_STRIP يرسم مثلثًا، ويرسم مثلثًا كل ثلاث نقاط
GL_TRIANGLE_FAN يرسم مثلثات
GL_QUADS يرسم الأشكال الرباعية
GL_QUAD_STRIP يرسم شرائح رباعية، يتم رسم شريط رباعي واحد لكل أربع نقاط
GL_POLYGON يرسم المضلعات
مثال لرسم ثلاث نقاط:
يبدأ
glPushMatrix;
glBegin(GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0.5,0.5);
glVertex2f(0.1,0.3);
glEnd;
SwapBuffers(Canvas.Handle);
نهاية؛
إذا قمت بتغيير GL_POINT إلى GL_LINES، فسوف تقوم برسم خط. النقطة الثالثة غير صالحة. سيؤدي إجراء glColor3f(0,0,1) قبل glVertex2f إلى تغيير لون الخط إلى اللون الأخضر. إذا قمت بتغيير GL_LINES إلى GL_LINE_STRIP، يمكنك الرسم اثنان خط مستقيم.
استخدم الإجراء glPointSize لتعيين حجم النقطة؛ واستخدم الإجراء glLineWidth لتعيين عرض الخط.
استخدم الإجراء glLineStipple لتعيين قالب خط الشرطة النقطية، واستخدم الإجراء glEnable(GL_LINE_STIPPLE) والمعلمات المقابلة لتمكين الرسم من رسم خطوط الشرطة النقطية. يقوم إجراء glDisable(GL_LINE_STIPPLE) والمعلمات المقابلة بإيقاف تشغيل خطوط الشرطة النقطية.
الإجراء glLineStipple(factor:GLint,pattern:GLushort);
يمثل عامل المعلمة عدد مرات التكرار لنمط قالب الخط المنقط. قيمة العامل هي 1255. النمط عبارة عن تسلسل ثنائي.
glLineStipple(1,0,0x11C);{0x11C يتم تمثيله كـ 10001110، 0 يعني عدم رسم النقاط، 1 يعني رسم النقاط}
مثال: يبدأ
glColor3f(1,0,0);
glLineWidth(2);
glLineStipple(1,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glEnd;
glDisable(GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
glEnd;
glDisable(GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
نهاية؛
رسم المضلع يشبه رسم خط النقطة، تحتاج إلى تغيير المعلمات إلى GL_POLYGON، GL_QUADS، GL_TRANGLES الأشياء التي يجب ملاحظتها عند الرسم:
تتقاطع جوانب المضلع عند القمم فقط
يجب أن يكون المضلع B مضلعًا محدبًا، وإذا كان مضلعًا مقعرًا، فيمكن للمستخدم طيه فقط في مضلع محدب لتسريع الرسم.
مثال: glBegin(GL_POLYGON);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glVertex2f(0.9,-0.6);
glVertex2f(0.5,-0.6);
glVertex2f(-0.9,-0.2);
glEnd;
للمضلعات جوانب أمامية وخلفية، والعمليات المتعلقة بهما هي:
يتحكم glPolygonMode في أوضاع رسم المضلع الأمامي والخلفي
يحدد glFrontface الوجه الأمامي للمضلع
يعرض glCullFace المضلعات التي تم ضبطها لإزالة الوجوه
يشكل glPolygonStripple نمط التعبئة المضلعة
3. سطح تربيعي بسيط
الأسطوانات والحلقات والمجالات كلها أسطح تربيعية.
اسطوانة
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
شرائح:GLint،مكدسات:GLint)؛
يحدد qobj سطحًا تربيعيًا، نصف القطر الأساسي هو نصف القطر الأساسي للأسطوانة؛ نصف القطر العلوي للأسطوانة المرسومة؛ الارتفاع هو ارتفاع شرائح الأسطوانة؛ الخطوط الفاصلة على طول المحور Z .
إذا لم يكن baseRadius وtopRadius متساويين، فيمكنك رسم الإحباط والمخروط.
الإجراء TfrmMain.MyDraw؛
فار
qObj:GLUQuadricObj;
يبدأ
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
نهاية؛
يحضر
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
الحلقات:جلينت)؛
الإجراء TfrmMain.MyDraw؛
فار
qObj:GLUQuadricObj;
يبدأ
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
نهاية؛
ج نصف دائرة
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
الحلقات:GLint،startAngle:GLdouble،sweepAngle:GLdouble)؛
startAngle وsweepAngle هما زاوية البداية وزاوية النهاية للنصف الدائرة.
الإجراء TfrmMain.MyDraw؛
فار
qObj:GLUQuadricObj;
يبدأ
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
نهاية؛
المجال د
وظيفة gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);
الإجراء TfrmMain.MyDraw؛
فار
qObj:GLUQuadricObj;
يبدأ
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
{صورة ظلية[ silu(:)5et]n صورة ظلية، مخطط تفصيلي}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
نهاية؛
E حول عملية السطح التربيعي
يقوم gluNewQuadric بإنشاء كائن سطحي تربيعي جديد
يقوم gluDeleteQuadric بحذف كائن سطحي تربيعي
يحدد gluQuadricDrawStyle نوع السطح التربيعي المراد رسمه
يقوم gluQuadricNormal بتعيين المتجه الطبيعي للسطح التربيعي
يحدد gluQuadricOrientation ما إذا كان السطح التربيعي يدور داخليًا أم يدور خارجيًا
يحدد gluQuadricTexture ما إذا كان السطح التربيعي يستخدم الملمس
F الخطوات العامة لرسم الأسطح التربيعية
قم أولاً بتعريف كائن GLUquadricObj؛
ثانيًا، قم بإنشاء كائن سطحي gluNewQuadric؛
اضبط خصائص السطح التربيعي مرة أخرى (gluQuadricDrawStyle، gluQuadricTexture)
رسم الأسطح التربيعية (gluCylinder، gluSphere، gluDisk، gluPartialDisk)
6. التحول في OPENGL
التحويل هو أساس تصميم الرسوم المتحركة، بما في ذلك الترجمة الرسومية والتدوير والقياس وغيرها من العمليات، والتي يتم تنفيذها رياضيًا من خلال المصفوفات.
1 عملية glLoadIdentity
قادرة على تحويل المصفوفة الحالية إلى مصفوفة الهوية.
2 عملية glLoadMatrix
قادرة على تعيين المصفوفة المحددة كمصفوفة الحالية.
الإجراء glLoadmatrixd(m:GLdouble);
الإجراء glLoadmatrixf(m:GLfloat);
تمثل m مصفوفة 4X4، الكود التالي يحددها ويجعلها المصفوفة الحالية
M: صفيف [1..4,1..4] من GLfloat؛
glLoadMatrix(@M);
3. عملية glMultMatrix
قادر على ضرب اللحظة الحالية بالمصفوفة المحددة واستخدام النتيجة كاللحظة الحالية.
الإجراء glMultMatrixd(M:GLdouble);
الإجراء glMultMatrixf(M:GLfloat);
4 glPushMatrix وglPopmatrix
يمكن لـ glPushMatrix دفع اللحظة الحالية إلى مكدس المصفوفة، ويمكن لـ glPopMatrix إخراج اللحظة الحالية من مكدس المصفوفة.
يمكن لـ glPushMatrix أن يتذكر الموضع الحالي للمصفوفة، ويمكن لـ glPopmatrix إرجاع الموضع السابق.
ملاحظة: يجب وضع glPushMatrix وglPopMatrix خارج glBegin وglEnd.
5 تحويل الإسقاط
يمكن لـ glOrtho إنشاء مصفوفة إسقاط إملائية، وضرب اللحظة الحالية بمصفوفة الإسقاط الإملائية، واستخدام النتيجة كمصفوفة حالية.
وظيفة glOrtho (يسار: GLdouble، يمين: GLdouble، أسفل: GLdouble، أعلى: GLdouble،
قريب: GLdouble، بعيد: GLdouble)؛
الإجراء TfrmMain.FormResize(Sender: TObject);
فار
nRange:GLfloat;
يبدأ
nRange:=50.0;
w:=clientWidth;
h:=clientHeight;
إذا ح = 0 ثم
ح:=1;
glViewPort(0,0,w,h);
إذا ث <= ح ثم
جلورثو(-nRange،nRange،-nRange*h/w،nRange*h/w،
-نرانج،نرانج)
آخر
جلأورثو(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
إعادة رسم؛
نهاية؛
يحدد B glOrtho2D فقط الجزء الأمامي والخلفي واليسار واليمين من حجم العرض الإملائي.
الإجراء glOrtho(left:GLdouble,right:GLdouble,bottom:GLdouble,top:GLdouble);
الإجراء C glMatrixMode
القدرة على تحديد نوع مصفوفة العملية الحالية
الإجراء glMatrixMode(mode:GLenum);
قيمة الوضع:
يحدد GL_MODELVIEW أن عمليات المصفوفة اللاحقة هي مكدسات مصفوفة النموذج
يحدد GL_PROJECTION أن عمليات المصفوفة اللاحقة تكون مكدسات مصفوفة الإسقاط
يحدد GL_TEXTURE أن عمليات المصفوفة اللاحقة عبارة عن مكدسات مصفوفة نسيج
عملية د جلفروستوم
قم بإنشاء مصفوفة إسقاط مائلة منظورية وضرب المصفوفة الحالية بمصفوفة الإسقاط المائلة والنتيجة هي المصفوفة الحالية.
الإجراء glFrustum (يسار: GLdouble، يمين: GLdouble، أسفل: GLdouble، أعلى: GLdouble،
التالي: GLdouble، بعيد: GLdouble)؛
تحدد هذه المعلمات مستويات القطع اليسرى واليمنى والأعلى والأسفل والأمامية والخلفية للإسقاط المائل.
عملية E gluPerspective
القدرة على تحديد حجم عرض الهرم رباعي الجوانب مع المحور Z كخط مركزي.
الإجراء gluPerspetive(fovy:GLdouble,aspect:GLdouble,zNear:GLdouble,zFar:GLdouble);
يحدد fovy منظور مستوى xoz، ويحدد الجانب النسبة في اتجاهي x وy، ويحدد zNear وzFar المسافات من نقطة العرض إلى مستوى القطع ومستوى القطع الخلفي على التوالي.
الإجراء TfrmMain.FormResize(Sender: TObject);
فار
الجانب:GLfloat؛
يبدأ
w:=ClientWidth;
h:=ClientHeight;
إذا ح = 0 ثم
ح:=1;
glViewPort(0,0,clientWidth,Clientheight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
الجانب:=ث/ساعة؛
gluPerspective(30.0,aspect,1.0,50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
نهاية؛
6 مصفوفة التحويل الهندسي
يشير تحويل وضعية الحركة لجسم ثلاثي الأبعاد إلى ترجمة الكائن وتدويره وقياسه.
يمكن لعملية glTranslate نقل أصل الإحداثيات إلى (x، y، z)، وبناء جملة الإعلان الخاص بها:
الإجراء glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
الإجراء glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
يمكن لـ B glRotate تدوير كائن إلى زاوية معينة، وصيغة الإعلان الخاصة به هي:
الإجراء glRotated(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
الإجراء glRotatef(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
ومنها الزاوية هي زاوية الدوران، والمحور المركزي للدوران هو الخط الذي يصل بين النقطتين (0,0,0) و(x,y,z).
يمكن لـ C glScale قياس نظام الإحداثيات، وصياغة الإعلان الخاصة به هي:
الإجراء glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
الإجراء glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
تمثل قيم x وy وz الأكبر من 1 تكبيرًا، والقيم الأقل من 1 تمثل تصغيرًا.
مثال على الكود الأصلي:
وحدة MainFrm؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
الحوارات، برنامج OpenGL، ExtCtrls؛
يكتب
TfrmMain = فئة (TForm)
Timer1: TTimer؛
الإجراء FormCreate(Sender: TObject);
إجراء FormDestroy(Sender: TObject);
الإجراء FormPaint(Sender: TObject);
الإجراء FormKeyDown(Sender: TObject; var Key: Word;
التحول: TShiftState)؛
إجراء FormResize(Sender: TObject);
الإجراء Timer1Timer(Sender: TObject);
الإجراء FormClose(Sender: TObject; var Action: TCloseAction);
خاص
{تصريحات خاصة}
hrc:HGLRC;
ث،ح:عدد صحيح؛
خط العرض وخط الطول: GLfloat؛
نصف القطر: GLdouble؛
عام
{التصريحات العامة}
الإجراء MyDraw؛
الإجراء تهيئةGL(عرض فار: GLsizei;الارتفاع: GLsizei);
نهاية؛
فار
frmMain: TfrmMain;
تطبيق
{$R *.dfm}
إجراء TfrmMain.FormCreate(Sender: TObject);
فار
pfd:TPixelFormatDescriptor;
تنسيق البكسل: عدد صحيح؛
يبدأ
ControlStyle:=ControlStyle+[csOpaque];
fillChar(pfd,sizeof(pfd),0);
مع قوات الدفاع الشعبي القيام به
يبدأ
nSize:=sizeof(TPixelFormatDescriptor);
nVersion:=1;
dwFlags:=PFD_DRAW_TO_WINDOW أو
PFD_SUPPORT_OPENGL أو PFD_DOUBLEBUFFER؛
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
نهاية؛
PixelFormat:=ChoosePixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientRect.Right;
h:=ClientRect.Bottom;
تهيئةGL(w,h);
نهاية؛
إجراء TfrmMain.FormDestroy(Sender: TObject);
يبدأ
wglDeleteContext(hrc);
نهاية؛
إجراء TfrmMain.FormPaint(Sender: TObject);
يبدأ
wglMakeCurrent(Canvas.Handle,hrc);
glClearColor(1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
MyDraw;
glFlush;
نهاية؛
الإجراء TfrmMain.MyDraw؛
فار
qObj:GLUQuadricObj;
يبدأ
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT أو GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glRotated(0.5,0.0,1.0,0.0);
glRotated(-latitude,1.0,0.0,0.0);
GLrotated(longitude,0.0,0.0,1.0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
نهاية؛
{إجراء TfrmMain.FormResize(Sender: TObject);
فار
nRange:GLfloat;
يبدأ
nRange:=50.0;
w:=clientWidth;
h:=clientHeight;
إذا ح = 0 ثم
ح:=1;
glViewPort(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
إذا ث <= ح ثم
جلورثو(-nRange،nRange،-nRange*h/w،nRange*h/w،
-نرانج،نرانج)
آخر
جلأورثو(-nRange*h/w,nRange*h/w,-nRange,nRange,
-nRange,nRange);
glMatrixMode(GL_MODELVIEW);
glLoadidentity;
إعادة رسم؛
نهاية؛
}
الإجراء TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
التحول: TShiftState)؛
يبدأ
إذا كان المفتاح = VK_ESCAPE إذن
يغلق؛
إذا كان المفتاح = VK_UP إذن
glRotatef(-5,1.0,0.0,0.0);
إذا كان المفتاح = VK_DOWN إذن
glRotatef(5,1.0,0.0,0.0);
إذا كان المفتاح = VK_LEFT إذن
glRotatef(-5,0.0,1.0,0.0);
إذا كان المفتاح = VK_RIGHT ثم
glRotatef(5.0,0.0,1.0,0.0);
إعادة رسم؛
نهاية؛
الإجراء TfrmMain.FormResize(Sender: TObject);
يبدأ
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort(0,0,clientWidth,clientHeight);
إعادة رسم؛
يبطل؛
نهاية؛
الإجراء TfrmMain.InitializeGL (عرض فار: GLsizei؛ الارتفاع: GLsizei)؛
فار
maxObjectSize,aspect:GLfloat;
near_plane:GLdouble;
يبدأ
glClearindex(0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
الجانب:=1.0;
gluPerspective(45.0,aspect,3.0,7.0);
glmatrixMode(GL_MODELVIEW);
near_plane:=0.3;
maxObjectSize:=0.3;
نصف القطر:=near_plane+maxObjectSize/2.0;
خط العرض:=0.3;
خط الطول:=0.6;
نهاية؛
إجراء TfrmMain.Timer1Timer(Sender: TObject);
يبدأ
timer1.Enabled:=false;
MyDraw;
أَثْمَر؛
Timer1.Enabled:=true;
نهاية؛
الإجراء TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
يبدأ
timer1.Enabled:=false;
إذا hrc<>فارغة إذن
wglDeleteContext(hrc);
نهاية؛
نهاية.
7. الإضاءة والملمس OPENGL
إنها جميعها وسائل لتعزيز التأثير ثلاثي الأبعاد وتأثير الألوان. يمكن أن تزيد الإضاءة من سطوع الرسومات وتأثيرها ثلاثي الأبعاد، كما يمكن للملمس أن يجعل الرسومات أكثر واقعية. من خلال استخدام الإضاءة، يمكن التعبير عن مظهر الكائن بطريقة قوية، ويمكن للأنسجة أن تجعل الكائن يظهر مجموعة متنوعة من المظاهر.
1 عمليات وتطبيقات الإضاءة ومصادر الضوء
يؤدي إجراء glIndex إلى جعل اللون الموجود في جدول فهرس الألوان هو اللون الحالي.
الإجراء glIndexd(c:GLdouble);
الإجراء glIndexf(c:GLdouble);
الإجراء glIndexi(c:GLdouble);
الإجراء glIndexs(c:GLdouble);
المعلمة C هي قيمة الفهرس إذا تم استخدام الإجراء glIndex، فسيتم تعيين عضو iPixelType في بنية TPiexlFormatDescriptor إلى PFD_TYPE_COLORINDEX.
الإجراء B glShadeModel
تقوم عملية glShadeModel بتعيين وضع التعبئة، القيمة: GL_SMOOTH.
الإجراء glShadeModel(mode:GLenum);
ملاحظة: لا يمكن استخدام العمليتين المذكورتين أعلاه إلا خارج glBegin....glEnd.
يحدد الإجراء C glLight مصدر الضوء
الإجراء glLightf(light:GLenum,pname:Glenum,param:GLfloat);
الإجراء glLighti(light:GLenum,pname:Glenum,param:GLfloat);
يحدد ضوء المعلمة مصدر الضوء، ويمكن أن تكون قيمته: GL_LIGHT0....GL_LIGHTN، قيمة N أقل من GL_MAX_LIGHT.
تحدد المعلمة pname معلمات مصدر الضوء:
كثافة مكون GL_AMBIENT للضوء المحيط
كثافة مكون GL_DIFFUSE للضوء المتناثر
كثافة مكون GL_SPECULAR للضوء المنعكس
موضع مصدر الضوء GL_POSITION
GL_SPOT_DIRECTION اتجاه تركيز مصدر الضوء
GL_SPOT_EXPONENT مؤشر مصدر الضوء
GL_SPOT_CUTOFF اتجاه مصدر الضوء
GL_CONSTANT_ATTENUATION عامل تحلل ثابت الضوء
GL_LINEAR_ATTENUATION عامل التوهين الثانوي للضوء
قم بتمكين مصادر الضوء وإيقاف تشغيلها باستخدام إجراءات glEnable() وglDisable()
glEnable(GL_LIGHTING); // تمكين مصدر الضوء
glDisable(GL_LIGHTING); //أطفئ مصدر الضوء
glEnable(GL_LIGHT0); // تمكين مصدر الضوء رقم 0
glDisable(GL_LIGHT0); // قم بإيقاف تشغيل مصدر الضوء رقم 0
مثال على ضبط مصدر الضوء:
فار
sdirection:Array[1..4] of GLfloat:={0.0,1.0,0.0,0.0};
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,sdirection);
2 نموذج المواد والإضاءة
يقوم إجراء glMaterial بتعيين معلمات المادة
الإجراء glMaterialf(face:GLenum,pname:Glenum,param:GLfloat);
الإجراء glMateriali(face:GLenum,pname:Glenum,param:GLfloat);
الإجراء glMaterialfv(face:GLenum,pname:GLenum,param:GLfloat);
الإجراء glMaterialiv(face:GLenum,pname:Glenum,param:GLfloat);
يحدد وجه المعلمة سطح الكائن، وقيمه هي: GL_FRONT، GL_BACK، GL_FRONT_BACK.
لم يتم تقديم pname,param في هذه المادة.
عملية B gLightModel
الإجراء glLightModelf(pname:GLenum,param:GLfloat);
المعلمة pname هي معلمة نموذج مصدر الضوء، والتي يمكن أن تأخذ القيمة GL_LIGHT_MODEL_AMBIENT،
GL_LIGHT_MODEL_LOCAL_VIEWER،GL_LIGHT_MODEL_TWO_SIDE.
رمز المثال:
الإجراء TfrmMain.SetLighting؛
فار
MaterialAmbient:array[1..4] من GLfloat؛
MaterialDiffuse:Array[1..4] من GLfloat؛
MaterialSpecular:Array[1..4] من GLfloat؛
AmbientLightPosition:Array[1..4] من GLfloat؛
LightAmbient:Array[1..4] من GLfloat؛
مادة اللمعان: GLfloat؛
يبدأ
MaterialAmbient[1]:=0.5;
MaterialAmbient[2]:=0.8;
MaterialAmbient[1]:=0.2;
MaterialAmbient[1]:=1.0;
MaterialDiffuse[1]:=0.4;
MaterialDiffuse[2]:=0.8;
MaterialDiffuse[3]:=0.1;
MaterialDiffuse[4]:=1.0;
MaterialSpecular[1]:=1.0;
MaterialSpecular[2]:=0.5;
MaterialSpecular[3]:=0.1;
MaterialSpecular[4]:=1.0;
مادة اللمعان:=50.0;
AmbientLightPosition[1]:=0.5;
AmbientLightPosition[2]:=1.0;
AmbientLightPosition[3]:=1.0;
AmbientLightPosition[4]:=0.0;
LightAmbient[1]:=0.5;
LightAmbient[2]:=0.2;
LightAmbient[3]:=0.8;
LightAmbient[4]:=1.0;
glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);
glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLShadeModel(GL_SMOOTH);
نهاية؛
3 تطبيق الملمس
يحدد glTexImage1D خريطة نسيج أحادية البعد.
الإجراء glTexImage1D (الهدف: GLenum، المستوى: GLint، المكونات: GLint، العرض: GLsizei،
الحدود: GLint، التنسيق: GLenum، النوع: GLenum، البكسل: GLvoid)؛
القيمة المستهدفة للمعلمة هي GL_TEXTURE_1D، والتي يتم تعريفها على أنها تعيين نسيج، والمستوى هو مستوى صورة النسيج بدقة متعددة المستويات، والعرض هو عرض النسيج، والقيمة 2n، وقيمة n هي 32، 64، 129، إلخ. الحدود هي حدود النسيج، وقيمته هي 0 أو 1، والبكسل هو موقع النسيج في الذاكرة، ويحدد المكون خلط RGBA وتعديله:
1اختر المكون ب
2اختر المكونات ب و أ
3 حدد مكونات R وG وB
4 حدد المكونات R، G، B، A
يحدد B glTexImage2D تعيين نسيج ثنائي الأبعاد
الإجراء glTexImage2D (الهدف: GLenum، المستوى: GLint، المكونات: GLint، العرض: GLsizei،
الحدود: GLint، التنسيق: GLenum، النوع: GLenum، البكسل: GLvoid)؛
إذا كان هدف المعلمة هو GL_TEXTURE_2D، فإن المعنى هو تعيين نسيج ثنائي الأبعاد، والارتفاع هو ارتفاع النسيج، والمعلمات الأخرى في الوظيفة هي نفس قيمة glTexImage1D.
رمز المثال:
الإجراء TfrmMain.SetTextures؛
فار
البتات: صفيف [1..64,1..64,1..64] من GLubyte؛
bmp:TBitmap;
أنا، ي: عدد صحيح؛
يبدأ
bmp:=TBitmap.Create;
bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
لأني: = 1 إلى 64 افعل
لـ j:=1 إلى 64 افعل
يبدأ
bits[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
البتات[i,j,4]:=255;
نهاية؛
يمثل {0 مستوى تظليل لوني واحد، بينما يمثل GL_RGBA قيمة مختلطة
64X64 يمثل ارتفاع وعرض المادة، 0 لا يمثل أي حدود،
يمثل GL_RGBA نوع النسيج، ويمثل GL_UNSIGNED_TYPE نوع البيانات، عنوان كائن @ Generation}
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,64,64,0,GL_RGBA,
GL_UNSIGNED_BYTE,@bits);
glEnable(GL_TEXTURE_2D);
نهاية؛
C gltexparameter الإجراء يضبط معلمات الملمس
الإجراء gltexparameterf (الهدف: glenum ، pname: glenum ، param: glfloat) ؛
الإجراء gltexparameteri (الهدف: glenum ، pname: glenum ، param: glfloat) ؛
يمثل هدف المعلمة gl_texture_1d أو gl_texture_2d ، والبرام هو قيمة الملمس.
دالة d gltexenv تعين معلمات البيئة من الملمس
وظيفة gltexenvf (الهدف: glenum ، pname: glenum ، param: glfloat) ؛
وظيفة gltexenvi (الهدف: glenum ، pname: glenum ، param: glfloat) ؛
هدف المعلمة هو gl_texture_env ،
المعلمة pname هي قيمة المعلمة الملمس ، والقيمة هي gl_texture_env_mode
المعلمة Param هي قيمة البيئة ، وقيمها هي gl_modulate و gl_decal و gl_blend.
نموذج رمز لهذا البرنامج:
الوحدة الرئيسية ؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار ، OpenGL ، extctrls ؛
يكتب
tfrmmain = فئة (tform)
Timer1: TTimer؛
الإجراء FormCreate(Sender: TObject);
إجراء FormDestroy(Sender: TObject);
Formpaint الإجراء (المرسل: tooject) ؛
الإجراء FormKeyDown (المرسل: TOBJECT ؛ VAR KEY: WORD ؛
التحول: TShiftState)؛
الإجراء formResize (المرسل: TOBJECT) ؛
الإجراء Timer1Timer(Sender: TObject);
الإجراء FormClose(Sender: TObject; var Action: TCloseAction);
خاص
{تصريحات خاصة}
HRC: HGLRC ؛
ث ، ح: عدد صحيح ؛
خط العرض ، خط الطول: glfloat ؛
دائرة نصف قطرها: gldouble.
عام
{التصريحات العامة}
الإجراءات الإضافات ؛
الإجراءات setTextures ؛
الإجراء mydraw.
الإجراء تهيئة gl (عرض var: glsizei ؛ الارتفاع: glsizei) ؛
نهاية؛
فار
frmmain: tfrmmain ؛
تطبيق
{$R *.dfm}
الإجراء tfrmmain.formcreate (المرسل: tobject) ؛
فار
PFD: tpixelformatdescriptor ؛
pixelformat: عدد صحيح.
يبدأ
ControlStyle: = ControlStyle+[csopaque] ؛
FillChar (PFD ، Sizeof (PFD) ، 0) ؛
مع PFD تفعل
يبدأ
nsize: = sizeof (tpixelformatdescriptor) ؛
NVERVER: = 1 ؛
dwflags: = pfd_draw_to_window أو
pfd_support_opengl أو pfd_doubleBuffer ؛
ipixeltype: = pfd_type_rgba ؛
ccolorbits: = 24 ؛
cdepthbits: = 32 ؛
ilayertype: = pfd_main_plane ؛
نهاية؛
pixelformat: = chooSepixelformat (canvas.handle ،@pfd) ؛
setPixelformat (canvas.handle ، pixelformat ،@pfd) ؛
HRC: = wglcreateContext (canvas.handle) ؛
W: = clientRect.Right ؛
H: = clientRect.Bottom ؛
initializegl (w ، h) ؛
نهاية؛
الإجراء tfrmmain.formdestroy (المرسل: tobject) ؛
يبدأ
wgldeletecontext (HRC) ؛
نهاية؛
الإجراء tfrmmain.formpaint (المرسل: tobject) ؛
يبدأ
wglmakeCurrent (canvas.handle ، HRC) ؛
glclearcolor (1،1،1،1) ؛
glcolor3f (1،0،0) ؛
glClear (gl_color_buffer_bit أو gl_depth_buffer_bit) ؛
setTextures
mydraw
تسليط الضوء
glflush
نهاية؛
الإجراء tfrmmain.mydraw ؛
فار
QOBJ: Gluquadricobj ؛
يبدأ
glpushmatrix
glClear (gl_color_buffer_bit أو gl_depth_buffer_bit) ؛
glcolor3f (1،0،0) ؛
glrotated (0.5،0.0،1.0،0.0) ؛
glrotated (-latitude ، 1.0،0.0،0.0) ؛
glrotated (خط الطول ، 0.0،0.0،1.0) ؛
QOBJ: = glunewquadric ؛
Gluquadricdrawstyle (Qobj ، Glu_line) ؛
Glusphere (QobJ ، 0.5،20،20) ؛
swapbuffers (canvas.handle) ؛
تسليط الضوء
setTextures
نهاية؛
{الإجراء tfrmmain.FormResize (المرسل: tobject) ؛
فار
nrange: glfloat ؛
يبدأ
nrange: = 50.0 ؛
W: = ClientWidth ؛
H: = ClientHeight ؛
إذا ح = 0 ثم
H: = 1 ؛
glviewport (0،0 ، w ، h) ؛
glMatrixMode(GL_PROJECTION);
Glovingidentity.
إذا كان w <= h ثم
GLORTHO (-nrange ، nrange ، -nrange*h/w ، nrange*h/w ،
-nrange ، nrange)
آخر
GLORTHO (-nrange*h/w ، nrange*h/w ، -nrange ، nrange ،
-nrange ، nrange) ؛
glMatrixMode(GL_MODELVIEW);
Glovingidentity.
إعادة الطلاء
نهاية؛
}
الإجراء tfrmmain.formkeydown (المرسل: tobject ؛ var مفتاح: Word ؛
التحول: TShiftState)؛
يبدأ
إذا المفتاح = vk_escape ثم
يغلق؛
إذا المفتاح = vk_up ثم
glrotatef (-5،1.0،0.0،0.0) ؛
إذا المفتاح = vk_down ثم
glrotatef (5،1.0،0.0،0.0) ؛
إذا المفتاح = vk_left ثم
glrotatef (-5،0.0،1.0،0.0) ؛
إذا المفتاح = vk_right ثم
glrotatef (5.0،0.0،1.0،0.0) ؛
إعادة الطلاء
نهاية؛
الإجراء tfrmmain.FormResize (المرسل: tobject) ؛
يبدأ
glMatrixMode(GL_PROJECTION);
Glovingidentity.
GLFRUSTUM (-1.0،1.0 ، -1.0،1.0،3.0،7.0) ؛
glviewport (0،0 ، clientwidth ، clientHeight) ؛
إعادة الطلاء
يبطل؛
نهاية؛
الإجراء tfrmmain.initializegl (عرض var: glsizei ؛ الارتفاع: glsizei) ؛
فار
MaxObjectsize ، الجانب: glfloat ؛
Lear_plane: gldouble ؛
يبدأ
glclearindex (0) ؛
glcleardepth (1.0) ؛
glenable (gl_depth_test) ؛
glMatrixMode(GL_PROJECTION);
الجانب: = 1.0 ؛
Gluperseptive (45.0 ، الجانب ، 3.0،7.0) ؛
GlmatrixMode (gl_modelview) ؛
Lear_plane: = 0.3 ؛
MaxObjectsize: = 0.3 ؛
RADIUS: = Lear_plane+maxObjectSize/2.0 ؛
خط العرض: = 0.3 ؛
خط الطول: = 0.6 ؛
نهاية؛
الإجراء tfrmmain.timer1timer (المرسل: tobject) ؛
يبدأ
Timer1.Enabled: = false ؛
mydraw
أَثْمَر؛
timer1.Enabled: = true ؛
نهاية؛
الإجراء tfrmmain.formClose (المرسل: tobject ؛ var الإجراء: tcloseaction) ؛
يبدأ
Timer1.Enabled: = false ؛
إذا hrc <> null ثم
wgldeletecontext (HRC) ؛
نهاية؛
الإجراء tfrmmain.SetLighting ؛
فار
MaterialAmbient: Array [1..4] من Glfloat ؛
MaterialDiffuse: صفيف [1..4] من glfloat ؛
MaterialSpecular: Array [1..4] من glfloat ؛
AmbientLightPosition: صفيف [1..4] من glfloat ؛
Lightambient: صفيف [1..4] من glfloat ؛
مواد: glfloat ؛
يبدأ
MaterialAmbient [1]: = 0.5 ؛
MaterialAmbient [2]: = 0.8 ؛
MaterialAmbient [1]: = 0.2 ؛
MaterialAmbient [1]: = 1.0 ؛
MaterialDiffuse [1]: = 0.4 ؛
MaterialDiffuse [2]: = 0.8 ؛
MaterialDiffuse [3]: = 0.1 ؛
MaterialDiffuse [4]: = 1.0 ؛
MaterialSpecular [1]: = 1.0 ؛
MaterialSpecular [2]: = 0.5 ؛
MaterialSpecular [3]: = 0.1 ؛
MaterialSpecular [4]: = 1.0 ؛
materialshininess: = 50.0 ؛
AmbientLightPosition [1]: = 0.5 ؛
AmbientLightPosition [2]: = 1.0 ؛
AmbientLightPosition [3]: = 1.0 ؛
AmbientLightPosition [4]: = 0.0 ؛
Lightambient [1]: = 0.5 ؛
Lightambient [2]: = 0.2 ؛
Lightambient [3]: = 0.8 ؛
Lightambient [4]: = 1.0 ؛
glmaterialfv (gl_front ، gl_ambient ،@materialambient) ؛
glmaterialfv (gl_front ، gl_diffuse ،@materiveDiffuse) ؛
glmaterialfv (gl_front ، gl_specular ،@materialSpecular) ؛
glmaterialfv (gl_front ، gl_shininess ،@materialShininess) ؛
gllightfv (gl_light0 ، gl_position ،@ambientLightPosition) ؛
gllightmodelfv (gl_light_model_ambient ،@lightambient) ؛
glenable (gl_lighting) ؛
glenable (gl_light0) ؛
glshademodel (gl_smooth) ؛
نهاية؛
الإجراء tfrmmain.settextures ؛
فار
البتات: صفيف [1..64،1..64،1..64] من Glubyte ؛
BMP: tbitmap ؛
أنا ، ي: عدد صحيح ؛
يبدأ
BMP: = tbitmap.create ؛
bmp.loadfromfile ('d: /dsoft/1119/02/logon.bmp') ؛
لأني: = 1 إلى 64 تفعل
ل j: = 1 إلى 64 تفعل
يبدأ
بت [i ، j ، 1]: = glbyte (getRvalue (bmp.canvas.pixels [i ، j])) ؛
بت [i ، j ، 2]: = glbyte (getRvalue (bmp.canvas.pixels [i ، j])) ؛
بت [i ، j ، 3]: = glbyte (getRvalue (bmp.canvas.pixels [i ، j])) ؛
بت [i ، j ، 4]: = 255 ؛
نهاية؛
glpixelstorei (gl_unpack_alignment ، 4) ؛
gltexparameteri (gl_texture_2d ، gl_texture_wrap_s ، gl_clamp) ؛
gltexparameteri (gl_texture_2d ، gl_texture_mag_filter ، gl_nearest) ؛
gltexparameteri (gl_texture_2d ، gl_texture_min_filter ، gl_nearest) ؛
{0 يمثل مستوى تظليل لون واحد ، يمثل GL_RGBA قيمة مختلطة
64x64 يمثل ارتفاع وعرض الملمس ، 0 لا يمثل حدود ،
يمثل GL_RGBA نوع الملمس ، يمثل GL_UNSIGNED_TYPE نوع البيانات ، عنوان كائن generation}
glteximage2d (gl_texture_2d ، 0 ، gl_rgba ، 64،64،0 ، gl_rgba ،
gl_unsigned_byte ،@bits) ؛
glEnable(GL_TEXTURE_2D);
gltexenvf (gl_texture_env ، gl_texture_env_mode ، gl_decal) ؛
نهاية؛
نهاية.