پرش به محتوای اصلی
پرش به محتوای مقاله

«تبدیل هر پیکسل به یک ردیف داده»؛ رندرینگ سه‌بعدی در ClickHouse

·۱۰ تیر ۱۴۰۵۵ دقیقه مطالعه
ردیابی پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse
ردیابی پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

رندرینگ کامل یک صحنه سه‌بعدی (Path Tracing) بدون استفاده از هیچ کد خارجی یا UDF، تنها با دستور SELECT در SQL. این اولین باری است که یک دیتابیس بدون ابزارهای کمکی، نقش یک موتور گرافیکی واقعی را ایفا می‌کند.

تصور کنید به جای استفاده از نرم‌افزارهای گرافیکی سنگین، تنها با نوشتن یک دستور SELECT در یک پایگاه‌داده، یک منظره سه‌بعدی واقع‌گرایانه خلق کنید. این اتفاق افتاده است و حالا مرز بین مدیریت داده و پردازش گرافیکی کمرنگ‌تر از هر زمان دیگری است.

بر اساس مستندات منتشر شده در ۱ جولای ۲۰۲۶، توسعه‌دهندگان موفق شدند با استفاده از کلیک‌هاوس (ClickHouse) یک سیستم رهیافت پرتویی یا پت-تریسر (Path Tracer) بسازند که مناظر تولیدی و متون کرومی را به‌طور کامل از طریق پرس‌وجوها محاسبه می‌کند. نکته کلیدی این است که این پیاده‌سازی «خالص» است؛ یعنی یک دستور SELECT واحد، هر پیکسل را بدون نیاز به کدهای خارجی یا توابع تعریف‌شده توسط کاربر (UDF) محاسبه می‌کند.

در این رویکرد، پایگاه‌داده دیگر یک جدول ساده از رکوردها نیست، بلکه شبیه به یک واحد پردازش گرافیکی (GPU) — یعنی سخت‌افزاری که میلیون‌ها محاسبه کوچک را هم‌زمان انجام می‌دهد تا تصویر روی صفحه ظاهر شود — عمل می‌کند. موتور رندر در این سیستم، هر پیکسل را به عنوان یک ردیف در دیتابیس می‌بیند. با استفاده از تابع numbers_mt(width * height * samples)، برای هر جفت (پیکسل، نمونه) یک ردیف ایجاد می‌شود و بدین ترتیب، موتور محاسبات سنگین ریاضی را روی تمام هسته‌های CPU موجود به صورت موازی پخش می‌کند. نمونه‌ها از طریق GROUP BY pixel میانگین‌گیری می‌شوند و ستون‌های r، g، b حاصل (در بازه [۰, ۱]) به همراه ستون‌های صریح مختصات x و y، مستقیماً از طریق فرمت خروجی تصویر بومی کلیک‌هاوس به یک فایل PNG نوشته می‌شوند. از آنجایی که مختصات با استفاده از pixel % width و intDiv(pixel, width) به صورت صریح تعریف شده‌اند، خروجی نیازی به دستور ORDER BY ندارد و این امر تضمین می‌کند که عملیات به صورت کاملاً موازی باقی بماند.

موتور فنی و سازوکارهای مهندسی

برای عبور از محدودیت‌های زبان SQL، این پروژه از چندین ترفند پیچیده مهندسی استفاده کرده است:

  • جبر خطی با توپل‌ها: بردارها به صورت Tuple(Float64, Float64, Float64) نمایش داده می‌شوند. موتور از توابعی مانند dotProduct (ضرب داخلی)، L2Normalize (نرمال‌سازی L2)، tuplePlus (جمع توپل‌ها) و tupleMultiplyByNumber (ضرب توپل در عدد) استفاده می‌کند. این توابع در قالب نام‌های مستعار کوتاه و لامبدا مانند va ،vs ،vm ،vd ،vn ،vc و vref بسته‌بندی شده‌اند تا خوانایی پرس‌وجو حفظ شود.
  • حلقه بازگشت (The Bounce Loop): در حالی که اولین نسخه از این پروژه از CTEهای بازگشتی (WITH RECURSIVE) استفاده می‌کرد، موتور فعلی برای تکرار روی range(maxDepth) از تابع arrayFold بهره می‌برد. در هر مرحله از این تکرار (Fold)، هر پرتو دقیقاً یک بازتاب آینه‌ای را طی می‌کند. این یک حلقه داخلی در هر ردیف است، به این معنی که ردیف‌ها مستقل از یکدیگر باقی می‌مانند.
  • اتصال مقادیر (Value Binding): لایه‌های لامبدای کلیک‌هاوس از نوع Call-by-name هستند که اگر مقداری به عنوان پارامتر پاس داده شود، می‌تواند منجر به انفجار درخت پرس‌وجو (Query Tree) شود. برای جلوگیری از این مشکل، مقادیر میانی با استفاده از ساختار arrayMap(x -> body, [expr])[1] به صورت Value-bound تثبیت می‌شوند؛ این کار در واقع یک اتصال «let» از طریق ایجاد یک آرایه تک‌عضوی ایجاد می‌کند.

ردیابی پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse

هندسه و مدل‌سازی محیط

صحنه با استفاده از هندسه صلب سازنده‌ای (CSG) طراحی شده است. حروف کلمه "ClickHouse" به صورت متون شیشه‌ای و کرومی رندر شده‌اند که از نظر سبک، یادآور پت-تریسر کارت‌ویزیکای شرکت پیکسار اثر اندرو کنسلر است. جزئیات هندسی شامل موارد زیر است:

  • استوانه‌ها: میله‌های گرد با کلاپ‌های تخت که برای خطوط مستقیم حروف مانند 'l' ،'i' ،'k' ،'H' ،'u' و خط افقی حرف 'e' به کار رفته‌اند.
  • توره (Tori): برای حروف گرد مانند 'C' ،'c' ،'o' ،'u' ،'s' و 'e' استفاده شده و از طریق میدان فاصله علامت‌دار (SDF) آن‌ها رندر (Ray-march) شده‌اند. بازشوهای حروفی مانند 'C' و 's' با تفریق یک باکس (جعبه) از حلقه ایجاد شده‌اند.
  • کره‌ها: برای نقطه روی حرف 'i' و یک «سیاره» کرومی (که با تفریق یک کره از کره دیگر ساخته شده) استفاده شده‌اند.

ردیاب پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse

  • متراعات (Parallelepipeds): جعبه‌های جهت‌دار (Oriented boxes) که برای خطوط با سطح تخت در دسترس هستند.

علاوه بر متن، یک زمین (Terrain) با استفاده از حرکت براونی کسری (fBm) تولید شده است که به صورت z = amp · fBm(x, y) تعریف می‌شود. این فرآیند چندین اکتاو از نویز مقدار شبکه‌ای (Lattice value-noise) را با هم جمع می‌کند. پرتوهای دوربین در برابر این سطح رندر می‌شوند. برای بهینه‌سازی سرعت و جلوگیری از ایجاد اثر پله‌ای (Step-banding)، عملیات March در نقاط خالی هوا جهش می‌کند (از جایی شروع می‌شود که پرتو به حداکثر ارتفاع زمین می‌رسد) و سپس برخورد با سطح را به صورت خطی درون‌یابی می‌کند.

ردیاب پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse

سیستم رنگ‌بندی این محیط طبق یک طیف ارتفاعی (Color Ramp) است که از آب $\rightarrow$ شن $\rightarrow$ چمن $\rightarrow$ سنگ $\rightarrow$ برف تغییر می‌کند. مدل نورپردازی نیز ترکیبی از یک خورشید گرم و نور محیطی سرد آسمان است که دارای مه فاصله (Distance Fog) در افق و سایه‌های محاسبه‌شده (Marched Shadows) برای هر دو موردِ خود-سایه زمین و سایه‌های ایجاد شده توسط حروف است.

ردیابی پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse

پروژه همچنین شامل یک انیمیشن به نام "ClickBulb" است که در آن یک چراغ رومیزی (که تماماً از کره‌های SQL ساخته شده) به درون صحنه می‌پرد، پشت بنر می‌رود و به بیننده نگاه می‌کند. هر فریم از این ویدیو، در واقع یک اجرای مجزا از همان پرس‌وجوی SQL است که برای رسیدن به کیفیت کامل ویدیو، یک بار برای هر فریم اجرا شده است.

ردیاب پرتو در SQL: پیاده‌سازی موتور رندرینگ سه‌بعدی با کوئری‌های پایگاه داده ClickHouse

تحلیل عملکرد و مقایسه

تمامی فایل‌ها در دایرکتوری queries/ به صورت مستقل و پارامتری هستند. اندازه تصویر از طریق getSetting (با استفاده از --output_format_image_width و --output_format_image_height) خوانده می‌شود و تعداد نمونه‌ها برای هر پیکسل به عنوان پارامتر {SAMPLES:UInt32} پاس داده می‌شود. برای مثال، تصویر اصلی با رزولوشن ۲۵۶۰ در ۱۲۰۰ و ۸ نمونه برای هر پیکسل رندر شده است.

تست‌های انجام شده روی پایگاه‌های داده مختلف، تفاوت‌های فاحشی را در قابلیت‌ها نشان داد:

  • کلیک‌هاوس: موتور اصلی که با بهره‌گیری از arrayFold رندرینگ سریع و موازی را فراهم می‌کند.
  • CedarDB: عملیاتی بود، اما ۳۳ برابر کندتر از کلیک‌هاوس بود و با باگ‌های متعددی دست‌وپنجه نرم می‌کرد (که در cedardb/issues#71 به آن‌ها اشاره شده است).
  • DuckDB: به طور کامل غیرعملیاتی بود؛ این دیتابیس حتی نتوانست تصاویر با کوچک‌ترین رزولوشن را با استفاده از آرایه‌ها یا CTEهای بازگشتی پردازش کند.

این تجربه فرضیه سنتی درباره «کاربرد دیتابیس» را می‌شکند. با اثبات اینکه رندرینگ پیچیده سه‌بعدی بدون UDFها ممکن است، کارایی کلیک‌هاوس در پردازش عددی خام (Numerical Throughput) برجسته می‌شود. این رویکرد در بهینه‌سازی لایه‌های پردازش، مشابه تلاشی است که پروژه‌هایی نظیر HelixDB برای حذف لایه‌های اضافی ذخیره‌سازی در عامل‌های هوش مصنوعی انجام می‌دهند تا نرخ بهره‌وری را افزایش دهند. این پروژه دیتابیس را به یک موتور محاسباتی همه‌منظوره برای کارهای به‌شدت موازی تبدیل می‌کند؛ مشابه سایر آزمایش‌های SQL مانند NoiSQL برای موسیقی یا شبیه‌ساز RISC-V کلیک-وی (Click-V).

گام بعدی شما

  • اگر می‌خواهید تجربه کنید، می‌توانید از مولدهای پایتون (gen.py و gen_fold.py) استفاده کنید.
  • این مولدها یک آرگومان پنجم اختیاری می‌پذیرند تا متن‌های دلخواه را با استفاده از یک فونت بیت-مپی ۷ رديفي رندر کنند. برای مثال، اجرای دستور python3 generators/gen_fold.py 640 256 16 4 "HELLO SQL" > hello.sql پرس‌وجویی تولید می‌کند که می‌تواند مستقیماً به یک نمونه محلی کلیک‌هاوس ارسال (Pipe) شود.
  • بررسی کنید که آیا توابع ریاضی داخلی دیتابیس شما قابلیت جایگزینی با منطق‌های پیچیده گرافیکی را دارد یا خیر.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است؛ برای درک اینکه چگونه تراشه‌ها این حجم از داده را جابه‌جا می‌کنند، به تحلیل ما درباره معماری GPUهای نسل جدید مراجعه کنید.

چرا این موضوع مهم است؟

این دستاورد با تکیه بر تخصص در پردازش موازی، ثابت می‌کند که ClickHouse فراتر از یک ابزار تحلیلی، یک موتور Compute قدرتمند است. این موضوع باعث بازنگری در معماری‌های پردازش داده سنگین می‌شود تا محاسبات پیچیده مستقیماً در لایه‌ی دیتابیس رخ دهد.

تأثیر برای ایران

برنامه‌نویسان ایرانی که در حوزه‌ی Big Data فعالیت می‌کنند، می‌توانند از این تکنیک برای پیاده‌سازی محاسبات ریاضی سنگین در لایه دیتابیس استفاده کنند تا گلوگاه‌های انتقال داده در سرورهای داخلی کاهش یابد.

·نگاه ما
تحریریه دات‌هوش

این پروژه نشان می‌دهد که محدودیت‌های زبان SQL بیشتر ذهنی است تا فنی. وقتی یک سیستم ذخیره‌سازی داده را به عنوان یک ماشین محاسباتی موازی (SIMD) ببینیم، مرز بین دیتابیس و زبان‌های سطح پایین مثل C++ یا HLSL از بین می‌رود. این رویکرد می‌تواند راه را برای اجرای مدل‌های ریاضی پیچیده در لایه‌ی ذخیره‌سازی باز کند تا نیاز به جابه‌جایی داده بین RAM و GPU کاهش یابد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.