هذا هو المقال الثاني في سلسلة "بطاقات ثلاثية الأبعاد لزلزال أواخر التسعينيات". في الجزء الأول ، قمنا بفحص
Rendition Vérité 1000 في نهاية عام 1996 ومنفذًا خاصًا للعبة يسمى vQuake. تمكنت Rendition من هزيمة الجميع في سوق الزلزال. لفترة قصيرة من الزمن ، ظلت اللوحة الوحيدة القادرة على إطلاق معرّف البرامج القوي مع تسريع الأجهزة.
ولكن كل هذا تغير في يناير 1997 ، عندما أصدرت id Software نسخة جديدة من Quake تسمى GLQuake. منذ أن تم إنشاء المنفذ باستخدام miniGL (مجموعة فرعية من معيار OpenGL 1.1) ، يمكن لأي شركة مصنّعة لأجهزة تسريع الأجهزة كتابة برامج تشغيل miniGL والمشاركة في سباق البطاقات ثلاثية الأبعاد. منذ تلك اللحظة ، كانت إمكانية المنافسة مفتوحة للجميع. كان الهدف هو توليد أكبر عدد ممكن من الإطارات في الثانية. كانت المكافأة شهرة ومال العملاء. بعد دراسة التاريخ لفترة وجيزة ، يمكن للمرء أن يفهم أن السلطات اثنين في ذلك الوقت بلا شك تعتبر ملوك الجبل المنتجين.
حتى الآن ، لا شك في ذلك: يحكم عالم الفودو الفودو. وبما أن Quake تحكم عالم الألعاب ، فإن شراء لعبة 3Dfx Voodoo أمر لا مفر منه تقريبًا للاعبين.
- توم الأجهزة ، 30 نوفمبر 1997
3DFX الفودو 1
- المعيار الذي تقاس به جميع البطاقات الأخرى.
- ملف جون كارماك .plan. 12 فبراير 1998 [2]
بمجرد إلقاء نظرة على المواصفات
[3] ، التي ذكرت سرعة تعبئة قدرها 50 ميجابكسل / ثانية ، أردت على الفور دراسة هذه البطاقة وفهم ما فعله 3dfx لإنشاء مثل هذا المنتج القوي.
3dfx التفاعلية
التقى روس سميث وسكوت سيلرز وجاري تارولي عندما عملوا معًا في SGI
[4] . بعد العمل قليلاً في Pellucid ، حيث حاولوا بيع لوحات IrisVision للكمبيوتر (في عام 1994 كلفت هذه اللوحات 4000 دولار لكل منهما) ، أسس الزملاء شركتهم الخاصة بدعم من Gordy Campbell TechFarm. 3dfx Interactive ، ومقرها في سان خوسيه ، كاليفورنيا ، تأسست في عام 1994.
في البداية ، كانت الشركة تنوي إنشاء أنظمة أجهزة قوية لآلات الألعاب ، ولكنها غيرت مسارها من خلال تطوير لوحات الكمبيوتر. كانت هناك ثلاثة أسباب لذلك.
- سعر منخفض إلى حد ما من ذاكرة الوصول العشوائي.
- بدءًا من FastPage RAM ثم EDO RAM ، انخفض الكمون في RAM بنسبة 30٪. الآن يمكن أن تعمل الذاكرة مع تردد يصل إلى 50 ميغاهيرتز.
- أصبحت الألعاب ثلاثية الأبعاد (أو ثلاثية الأبعاد الزائفة) أكثر شيوعًا. أظهر نجاح ألعاب مثل DOOM و Descent و Wing Commander III أن سوقًا مسرعات ثلاثية الأبعاد على وشك الظهور.
أدرك مؤسسو الشركة أنهم بحاجة إلى إنشاء شيء قوي ومصمم للألعاب وبسعر التجزئة في حدود 300-400 دولار. في عام 1996 ، أعلنت الشركة عن إنشاء بنية SST1 (سميت باسم المؤسسين - Sellers-Smith-Tarolli-1) ، والتي تم ترخيصها قريبًا من قبل العديد من مصنعي المعدات الأصلية مثل Diamond و Canopus و Innovision و ColorMAX. من أجل ابتكارهم ، جاء اسم التسويق "Voodoo1" ، مع التشديد على أدائه السحري.
كما هو الحال في V1000 ، عند إنشاء البطاقات ، يمكن للمصنعين فقط تغيير نوع ذاكرة الوصول العشوائي المحددة (EDO أو DRAM) ولون اللوحات والترتيب المادي للرقائق. تقريبا كل شيء آخر كان موحد.
الماس الوحش 3D ، صورة مأخوذة من vgamuseum.info.Canopus Pure3D ، الصورة مأخوذة من vgamuseum.info.BIOSTAR فينوس 3D ، صورة مأخوذة من vgamuseum.info.ORCHID الصالحين 3D ، صورة مأخوذة من vgamuseum.info.عند النظر إلى لوحة SST1 ، كان من المذهل مدى اختلافها عن منافسيها - Rendition Verite 1000 و NVidia NV1.
أولاً ، اتخذ 3dfx خطوة جريئة ، حيث تخلى عن دعم العرض الثنائي الأبعاد. كان Voodoo1 منفذي VGA ، واحد يستخدم كمخرج ، والآخر كمدخل. تم تطوير البطاقة كإضافة ، واستغرق الأمر كإدخال الإخراج من بطاقة VGA ثنائية الأبعاد ، مثبتة بالفعل في الكمبيوتر. عندما كان المستخدم يعمل مع نظام التشغيل (DOS أو Windows) ، قام Voodoo1 ببساطة بإعادة توجيه الإشارة من إدخال VGA الخاص به إلى إخراج VGA. عند التبديل إلى الوضع ثلاثي الأبعاد ، سيطر Voodoo1 على خرج VGA وتجاهل الإشارة من مدخل VGA. تحتوي بعض اللوحات على مفتاح ميكانيكي نقر عند التبديل بين وضعي الأبعاد الثنائية والثلاثية الأبعاد. يعني هذا القرار أنه لا يمكن استخدام البطاقة إلا في وضع ملء الشاشة ، ولم يكن هناك وضع "نافذة".
الجانب الثاني الجدير بالملاحظة من SST1 هو أنه لم يصنع من وحدة معالجة مركزية واحدة ، ولكن من حلقتين ASIC غير قابلتين للبرمجة (دائرة متكاملة خاصة بالتطبيقات ، دوائر متكاملة ذات أغراض خاصة). إذا كنت تمشي على طول مسارات الإطارات ، يمكنك أن ترى أن كل من الرقائق المسماة "TMU" و "FBI" لها ذاكرة RAM خاصة بها. على بطاقة الذاكرة ، تم تقسيم 4 mebibytes من ذاكرة الوصول العشوائي بالتساوي: 2 mebibytes TMU لتخزين المواد و 2 mebibytes FBI لتخزين المخزن المؤقت الملون و z-buffer ، بينما تم تخزين القيم على التوالي مثل RGBA 16 بت و عدد صحيح / 16 بت صحيح. بطاقة ذاكرة بها 4 ميغا بايت تدعم دقة تصل إلى 640 × 480 (2 من المخازن المؤقتة للألوان (640 × 480 × 2) للتخزين المؤقت المزدوج + 1 من المخازن المؤقتة للعمق (640 × 480 × 2) = 1 843 200). سمحت النماذج الأحدث التي تحتوي على 4 ميغا بايت من ذاكرة الوصول العشوائي FBI باستخدام دقة تصل إلى 800x600 (2x800x600x2 + 800x600x2 = 2،880،000).
تقديم خط أنابيب SST1
لا يتم وصف الناقل بالتفصيل في المواصفات. وفقًا لتفسيراتي ، فإن عمر المثلث يتكون من خمس مراحل.

- يتم إنشاء مثلث وتحويله في المعالج الرئيسي للكمبيوتر (عادةً Pentium). تتضمن هذه العمليات الضرب بمصفوفة مساحة النموذج / الإسقاط ، والتقطيع ، وتقسيم منظور قمة الرأس ، وقطع الإحداثيات المتجانسة ، وتحويل مجال الرؤية. في نهاية هذه العملية ، تبقى مثلثات مرئية فقط من مساحة الشاشة (بسبب القطع ، قد يتحول مثلث واحد إلى اثنين).
- باستخدام الأمر triangleCMD ، يتم نقل المثلثات عبر ناقل PCI إلى واجهة Frame Buffer (FBI). يتم تحويلها إلى استعلامات السلسلة النقطية التي تم إنشاؤها بواسطة وحدة تعيين النسيج. لكل عنصر من عناصر الخط النقطي (يُطلق عليه جزء) ، تقوم وحدة TMU بإجراء ما يصل إلى أربعة استعلامات بحث لكل بكسل إذا كان المطور يحتاج إلى تصفية ثنائية الخط. يتم تنفيذ تقسيم منظور مجزأة أيضا في TMU.
- تقوم TMU بإرسال شظايا إلى FBI كقيمة ألوان بتنسيق RGBA ذي 16 بت + وقيمة z 16 بت.
- يقوم FBI بإجراء اختبارات تجزيئية في المخزن المؤقت z ، ومقارنتها بذاكرة الوصول العشوائي المخصصة ، والتي تخزن قيم RGBA والقيم z لمخزن الإطارات المؤقت.
- أخيرًا ، يتم تطبيق الإضاءة على الجزء استنادًا إلى سمة اللون الخاصة به والبحث في جدول الضباب المكون من 64 عنصرًا. إذا كان الخلط مطلوبًا ، فإن FBI يجمع بين الجزء الناتج مع ما هو موجود بالفعل في مخزن الألوان المؤقت.
حقيقة مثيرة للاهتمام: إذا كنت من محبي 3D ، فمن المحتمل أن تعرف رمز الجذر التربيعي العكسي السريع ، والذي أصبح مشهورًا بفضل كود Quake 3 الأصلي:
float Q_rsqrt(float number) { long i; float x2, y; const float threehalfs = 1.5f; x2 = number * 0.5f; y = number; i = * (long*) &y;
بحثًا عن
[5] ، اتصل المصدر Q_rsqrt Rys for Software بغاري تارولي ، الذي قال إنه استخدم هذا الكود بينما كان لا يزال يعمل في SGI. لذلك من العدل افتراض أنه تم استخدامه أيضًا في خط أنابيب SST1.
شيء غير متطابق
بعد التعرف على الناقل ومع العلم أن كل مكون (TMU و FBI و EDO RAM) يعمل بتردد 50 MHz ، يمكننا أن نفهم أن هناك نوعًا من الأخطاء في الحسابات ولا يمكن أن تصل البطاقة إلى 50 ميجابكسل / ثانية. كان لا بد من حل مشكلتين هنا.
أولاً ، كان على TMU قراءة أربعة texels لأداء تصفية النسيج الثنائية. وهذا يعني أن هناك حاجة إلى أربع دورات من الوصول إلى ذاكرة الوصول العشوائي ، مما سيؤدي إلى نقص البيانات الخاصة بوحدة TMU وبمعدل ملء قدره 50/4 = 12.5 ميجابكسل / ثانية.
هناك عنق الزجاجة آخر على مستوى مكتب التحقيقات الفيدرالي. إذا تم تمكين التحقق من z-buffer ، فقبل كتابة أو التخلص من القيمة z الواردة للجزء يجب مقارنته بما هو موجود بالفعل في z-buffer. إذا نجح الاختبار ، فيجب تسجيل القيمة. هاتان العمليتان مع RAM ، مما أدى إلى انخفاض معدل التعبئة بمقدار النصف: 50/2 = 25 ميجابكسل / ثانية.
رباعية تشذير TMU
تم ذكر حل مشكلة العينة الأربعة في مرحلة TMU في مواصفات SST1.
يتم تطبيق التشذير الكامل في مسار بيانات ذاكرة النسيج ، والذي يسمح للبنك الواحد بالوصول إلى البيانات بغض النظر عن العنوان المستخدم للوصول إلى البيانات في البنوك الأخرى.
- مواصفات SST1
لا يشير إلى ما إذا كان الناقل يستخدم تعدد إرسال العناوين أم البيانات المشتركة أو حافلات العناوين. من الأسهل معرفة ذلك إذا قمت برسمها دون مضاعفة ودون فصل.
بغض النظر عن التفاصيل ، سمحت بنية TMU بتلقي 4 × 16 بتات لكل دورة. إذا وصلت بيانات الإدخال إلى التردد الصحيح ، فيمكن أن تقوم وحدة TMU بإجراء القسمة على الشظية بواسطة w ، ثم تقوم بإنشاء قيمة z للجزء (16 بت) ولون الجزء (16 بت) ، الذي تم إرساله إلى FBI.
في اتجاهين تشذير مكتب التحقيقات الفدرالي
الحل لمشكلة عمليتي الوصول RAM في مرحلة FBI أيضاً لم يتم وصفها في المواصفات. ومع ذلك ، تشير الوثيقة إلى معدل تعبئة قدره 100 ميجابكسل / ثانية تم تحقيقه باستخدام glClear نظرًا للقدرة على تسجيل بكسلين لكل دورة ، وهذا يجعلنا نفهم أنه تم استخدام التداخل ثنائي الاتجاه هنا.
يقوم مكتب التحقيقات الفيدرالي بقراءة وكتابة بكسلين في وقت واحد (2 × 1 بكسل يتكون من لون 16 بت و 16 بت = 64 بت). للقيام بذلك ، يولد العنوان 21 بت عنوانين 20 بت ، حيث يتم تجاهل الأقل أهمية في قراءة / كتابة بكسلين بالترتيب. نظرًا لأن خوارزمية الخط النقطي اللازمة للكتابة / القراءة في خطوط أفقية تنتقل من اليسار إلى اليمين ، فإن قراءة بكسلين ترتيبيين في وقت واحد كان جيدًا.
ناقل 64 بت TMU-> FBI
الجزء الأخير من اللغز هو ناقل FBI-TMU 64 بت. لا يتم كتابة أي شيء تقريبًا في المواصفات ، ولكن يمكن فهم سلوكها من خلال البيانات التي يستهلكها مكتب التحقيقات الفيدرالي. نظرًا لأن FBI يعالج بيكسلين في كل مرة ، فمن المعقول افتراض أن وحدة TMU لا ترسل texels في أسرع وقت ممكن ، ولكنها تجمع بينهما بلونين 16 بت + قيمة z 16 بت.
برمجة الفودو 1
في أدنى مستوى ، تم برمجة Voodoo1 باستخدام سجلات الذاكرة المعينة. تتكون واجهة برمجة التطبيقات من عدد صغير جدًا من الأوامر ، فهناك خمسة منها فقط: TRIANGLECMD (بنقطة ثابتة) ، FTRIANGLECMD (بنقطة عائمة) ، NOPCMD (no-op) ، FASTFILLCMD (مسح المخزن المؤقت) و SWAPBUFFERCMD اختبار z ، وتنزيلات ألوان الضباب والمزيد. تم إجراء تحميل الملمس في VRAM من خلال ذاكرة الوصول العشوائي PCI التي تبلغ 8 ميغا بايت فقط مع تعيين الذاكرة.
(ريال) Voodoo1 البرمجة
قام المطورون ببرمجة Voodoo1 من خلال واجهة برمجة تطبيقات Glide
[6] . استلهم IRIS GL / OpenGL منطق تصميم واجهة برمجة التطبيقات ، حيث استخدم جهازًا حكوميًا وبادئات لكل شيء (تم استخدام "gr" فقط بدلاً من "gl" ، والمبرمجين اللازمين للتحكم في VRAM ، كما هو الحال الآن في Vulkan.)
#include <glide.h> void main( void ) { GrHwConfiguration hwconfig; grGlideInit(void); grSstSelect( 0 ); grSstQueryHardware(&hwconfig); grSstSelect(0); grSstWinOpen(null, GR_RESOLUTION_640x480, GR_REFRESH_60HZ, GR_COLORFORMAT_RGBA, GR_ORIGIN_LOWER_LEFT, 2, 0); grBufferClear(0, 0, 0); GrVertex A, B, C; ... // Init A, B, and C. guColorCombineFunction( GR_COLORCOMBINE_ITRGB ); grDrawTriangle(&A, &B, &C); grBufferSwap( 1 ); grGlideShutdown(); }
MiniGL "قياسي"
على الرغم من أن MiniGL كانت مجموعة فرعية من معيار OpenGL 1.1 ، إلا أنه لم يتم إصدار مواصفات لذلك. كان MiniGL "مجرد تلك الميزات التي يستخدمها Quake." من خلال تشغيل objdump لثنائي quake.exe ، من السهل بناء قائمة "رسمية".
$ objdump -p glquake.exe | grep "gl"
glAlphaFunc glDepthMask glLoadIdentity glShadeModel
glBegin glDepthRange glLoadMatrixf glTexCoord2f
glBlendFunc glDisable glMatrixMode glTexEnvf
glClear glDrawBuffer glOrtho glTexImage2D
glClearColor glEnable glPolygonMode glTexParameterf
glColor3f glEnd glPopMatrix glTexSubImage2D
glColor3ubv glFinish glPushMatrix glTranslatef
glColor4f glFrustum glReadBuffer glVertex2f
glColor4fv glGetFloatv glReadPixels glVertex3f
glCullFace glGetString glRotatef glVertex3fv
glDepthFunc glHint glScalef glViewport
إذا بدأت تعلم OpenGL مؤخرًا ، فيجب أن تثير اهتمامك أسماء الوظائف مثل glColor3f و glTexCoord2f و glVertex3f و glTranslatef و glBegin و glEnd. لقد تم استخدامها في وضع يسمى "الوضع الفوري" ، حيث تمت الإشارة إلى تنسيق الرأس وتنسيق النسيج ومعالجة المصفوفة واللون بواسطة استدعاء دالة واحد في كل مرة.
هذه هي الطريقة "في تلك الأيام" التي رسمها مثلث ومظلل بمثلث Gouraud.
void Render { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glBindTexture(GL_TEXTURE_2D, 1);
GLQuake
كان من المفترض أن يوفر معدل الملء الأقصى النظري البالغ 50 ميجابكسل / ثانية ما يقرب من 50 إطارًا في الثانية بدقة 640 × 480. ومع ذلك ، نظرًا لقيام Quake بدمج طبقتين من القوام لكل سطح (واحدة للألوان والأخرى لخريطة الإضاءة) ، كان على SST1 رسم كل إطار مرتين مع مزج إضافي في الممر الثاني. نتيجة لذلك ، ركض الزلزال بسرعة 26 إطارًا في الثانية على P166Mhz.
بتقليل الدقة إلى 512 × 384 على نفس الجهاز ، كان من الممكن تحقيق سلاسة تبلغ 41 إطارًا في الثانية
[7] ، والتي لم يكن من الممكن توفيرها في ذلك الوقت من قبل أي منافس.
تقديم البرمجيات
GLQUAKE VOODOO1
حقيقة مثيرة للاهتمام: SST1 لم يكن للجميع. أبدى بعض الأشخاص إعجابهم بالبكسل ووجدوا أن الترشيح الثنائي "غير واضح". البعض الآخر منزعج من فقدان تصحيح غاما.
يبدو Glquake حماقة. أعتقد أنه يمكن لأي شخص أن يجادل في هذا الأمر ، لكن دعنا نعترف - يبدو مروعًا ، خاصة على بطاقات NVidia. على لوحات 3dfx ، كل شيء ليس سيئًا للغاية ... لكن الألوان لا تزال غير واضحة. على TNT2 ، الصورة مثيرة للاشمئزاز ؛ هي مظلمة جدا وقاتمة.
-Frib ، Glquake & QW Guide [8]
3fdx الفودو 2
إذا قلت أن قواعد 3dfx في السوق من 1996 إلى 1998 ، فإن هذا سيكون بخس. بعد SST1 ، رفعت تقنية Voodoo
2 العارضة بدرجة أكبر بفضل ذاكرة الوصول العشوائي (EDO) بسرعة 100 ميجاهرتز و ASIC بتردد قدره 90 ميجاهرتز ، وليس واحدًا فقط ، ولكن وحدتي TMUs ، مما يسمح بتقديم إطار زلزال متعدد العناصر (إضاءة ملونة +) في مسار واحد
[9] . كانت هذه التقنية وحشًا حقيقيًا ، وحتى بطاقات الرسومات نفسها بدت فخمة.
تضاعفت سرعة التعبئة في Voodoo
2 تقريبًا ، حيث وصلت إلى 90 ميجا بكسل / ثانية. ارتفعت مؤشرات الزلزال إلى 80 إطارًا في الثانية مذهلًا على Pentium II 266 MMX (مقارنة بـ 56 إطارًا في الثانية مع Voodoo1) ، في الواقع ، حيث وصلت إلى حدود إمكانيات منطق اللعبة والشاشات.
Super Voodoo 2 12MB ، الصورة مأخوذة من vgamuseum.info.لسوء الحظ ، بعد إصدار Voodoo3 في عام 1999 ، حققت قصة 3dfx منعطفًا حادًا. بدأت تسعى جاهدة لتطوير بطاقاتها العالمية الخاصة وتوقفت عن بيع تكنولوجيا تصنيع المعدات الأصلية التي تواجه منافسة متزايدة.
لم يكتمل هذا الانتقال كما هو متوقع ، وكان أداء Voodoo3 مخيبا للآمال مقارنةً بـ GeForce 256 من NVidia ، القادر على توفير التغطية بالفسيفساء والإضاءة (قامت بنتيوم بهذا الجزء في خط الأنابيب).
استجابةً ل NVidia ، ألغت 3dfx تطوير Voodoo4 للبدء في بناء Voodoo5 بتقنية VSA-100 (Voodoo Scalable Architecture). كانت النتيجة غير متوقعة: بعد إصدار "Napalm" (الاسم الرمزي للبطاقة) ، واجهت بطاقات NVidia GeForce 2 و ATI Radeon الأكثر قوة. في النهاية ، في 28 مارس 2000 ، تقدمت 3dfx بطلب للإفلاس وتم شراؤها بواسطة NVidia.
بالنسبة لأولئك الذين عاشوا في أواخر التسعينيات وكانوا سعداء بلعب Voodoo1 أو Voodoo2 ، فإن 3dfx لا تزال شركة تمثل رمزًا مميزًا للتميز. أصبحت قصيدة للنجاح المستحق الذي تحقق من خلال الشجاعة والموهبة المتميزة والعمل الجاد. شكرا يا شباب!
المواد المرجعية
[1] المصدر:
قصة Rendition Vérité 1000[2] المصدر:
جون كارماك. 12 فبراير 1998[3] المصدر:
SST-1 ، محرك رسومات عالية الأداء لتسريع الألعاب ثلاثية الأبعاد[4] المصدر:
3dfx Oral History Panel[5] المصدر:
منشأ QuS3's Fast InvSqrt ()[6] المصدر:
دليل برمجة الانزلاق[7] المصدر:
مقارنة معدلات الإطارات في GLQuake باستخدام بطاقات الفودو والفودو 2 3D[8] المصدر:
Frib، Glquake & QW Guide[9] المصدر:
رسومات VOODOO2 عالية الأداء محرك رسومات لتسريع الألعاب ثلاثية الأبعاد