من دارم Mandelbrotset را با C++ با استفاده از OpenGL برنامه نویسی می کنم، اما با یک مشکل مواجه شده ام: شناورهایی که به آنها می فرستم و در شیدر خود محاسبه می کنم، فقط می توانند مقدار معینی از رقم های اعشاری را در خود جای دهند. بنابراین اگر بیش از حد زوم کنم، فقط پیکسلی می شود.
من به ایجاد توابع آرایه سفارشی فکر کردم اما واقعاً نمی توانم آن را بفهمم. آیا راهی جز استفاده از آرایه وجود دارد؟و اگر نه چگونه می توانم چیزها را با استفاده از آرایه ها محاسبه کنم که انگار یک عدد هستند؟(به عنوان مثال arr[1, 2] x arr[0, 2] باید همان خروجی را داشته باشد که فقط 1. 2 x 0. 2 را محاسبه کنید)
^ تابع Mandelbrot در Fragmentshader من
می توانید با استفاده از دوبل به جای شناور شروع کنید، که دقت مضاعفی را به شما می دهد. اگر به بیش از این نیاز دارید، می توانید «حساب دقیق دلخواه» را جستجو کنید و کتابخانه ای مانند GMP پیدا کنید. اما هشدار داده شود: محاسبات دقیق دلخواه آهسته است. همچنین می توانید «رویکرد تئوری اغتشاش» را برای محاسبه مجموعه ماندلبروت جستجو کنید.
@user253751 doubles توسط OpenGL پشتیبانی نمی شوند، اما محاسبه دقیق دلخواه امیدوارکننده به نظر می رسد و من یک کتابخانه GLSL برای آن پیدا کردم، اما واقعاً نمی دانم چگونه کار می کند و سرعت مهم است زیرا سعی می کنم آن را در زمان واقعی نشان دهم (بنابراینمن می توانم آن را روی صفحه نمایش در ارائه مدرسه خود نشان دهم).
@SpaceKek double توسط OpenGL پشتیبانی می شود (شما باید از نمایه اصلی استفاده کنید یا برای GLSL قدیمی تر گسترش را فعال کنید) پاسخ من را با دقت مضاعف ببینید، اما تا حدی حق با شماست، دوبل ها برای interpolators پیاده سازی نمی شوند، بنابراین متغیرهای مختلف ارسال شده بین سایه زن ها نمی توانند دو برابر شوند.
3 پاسخ 3
همانطور که دیگران پیشنهاد کردند به جای float از دو برابر استفاده کنید که امکان زوم بسیار بالاتری به شما می دهد. علاوه بر این، از فرار کسری استفاده کنید که جزئیات بسیار بالاتر را با تکرارهای بسیار کمتر امکان پذیر می کند، بنابراین سرعت بیشتر با جزئیات بهتر را ببینید:
کد شناور برای Mandelbrot معدن و پیوندهایی به دموهای Win32 برای هر دو 32 و 64 بیت شناور وجود دارد. با این حال، سایه زن های نسخه دوگانه برای پاسخ مناسب نبودند، بنابراین آنها در اینجا هستند (برای فراکتال، سایه زن های رنگ آمیزی پاس دوم مهم نیستند، اما می توانید آنها را از نسخه نمایشی استخراج کنید):
این می تواند به بزرگنمایی = 1e+14 که در آن پیکسل ها شروع به رخ دادن می کنند، بالا رود:

استفاده از شناور دقیق دلخواه در GPU بسیار کند و مشکل ساز خواهد بود (همانطور که دیگران قبلاً پیشنهاد کردند). با این حال راه حل های ساده تری برای افزایش دقت شناور یا دوبل وجود دارد.
به عنوان مثال می توانید مقدار خود را به عنوان مجموع دو برابر بیشتر نگه دارید.
جایی که x = x0+x1+x2+.+xn که در آن x0 مقادیر کوچک را نگه می دارد ، x1 بزرگتر ،. XN بزرگترین. شما فقط به عملیات اساسی +،-،* نیاز دارید
x += y
x -= y
x *= y
و بعد از هر عمل ، شما به دامنه هر متغیر عادی می شوید:
شما باید دامنه ها را انتخاب کنید تا متغیرهای خود را بر روی شماره هایی که مورد استفاده قرار نمی گیرند هدر ندهید.
با این دقت هنوز محدود است اما از دست دادن دقت بسیار کوچکتر است.
با این حال هنوز یک حد وجود دارد (که به راحتی قابل عبور نیست). در حال حاضر شما در حال محاسبه موقعیت از مختصات قطعه ، بزرگنمایی و PAN X ، y هستید که به شناور محدود می شود زیرا ما هنوز 64بای دوتایی نداریم. اگر می خواهید این سد را بشکنید ، باید موقعیت بزرگنمایی شده را در سمت CPU یا در راس به همان روشی که بقیه محاسبات (جمع متغیرهای بیشتر اما این بار شناور است) محاسبه کنید و نتیجه را به صورت متغیر به قطعه منتقل کنید.
سلام ، من سعی کردم از طریق ایمیل به شما برسم ، آیا می توانید با این سوال به من کمک کنید :) stackoverflow.com/questions/65025429/…
شما همیشه می توانید با دو برابر بروید ، اما از آنجا که این سایه بان است و در GPU اجرا می شود ، با یک مجازات عملکرد همراه خواهد بود. یکی از ترفندهایی که می توانید از آن استفاده کنید این است که به چنین مقادیر کم بروید ، جایی که دقت به یک مشکل تبدیل می شود. درعوض ، همانطور که بزرگنمایی می کنید می توانید نتایج خود را در برخی از مقادیر پشتیبان گیری کنید ، اساساً مقادیر را در محدوده پایدار نگه دارید که دقت در آن مشکلی ندارد. IRC ، توسعه دهندگان برنامه فضایی Kerbal در واقع یک پست وبلاگ در مورد این تکنیک دارند ، بنابراین می توانید آن را بررسی کنید.
نمی توانید یکی از KSP را پیدا کنید ، بنابراین در اینجا پیوندی به چیزی مشابه در YouTube ، توسط سباستین لاگ است. قسمت مربوطه حدود 10 دقیقه علامت است.
این مشکل را برطرف نمی کند. محاسبه مجموعه Mandelbrot نیاز به استفاده از تعداد زیاد و تعداد کمی در کنار هم دارد. شما هنوز هم با انجام ریاضیات با تعداد بسیار زیاد و اعداد "اندازه عادی" در کنار هم دقت خود را از دست می دهید.
خوب اول ، اگر به جای شناور از دو برابر استفاده می کنید ، دو برابر دقت بیشتری کسب می کنید. اما این کد GPU است ، بنابراین دو برابر می تواند کندتر باشد.(روی یک CPU ، دو و شناور تقریباً یکسان است)
موردی که شما به دنبال آن هستید ، حسابی دقیق دلخواه نامیده می شود. خیلی کندتر است. می توانید کتابخانه هایی را پیدا کنید که این کار را انجام دهند ، مانند GMP. اما اینها برای CPU است. ظاهراً برخی از GPU نیز وجود دارد - من با آنها آشنا نیستم. به یاد داشته باشید ، کند است!
شما می توانید حسابی دقیق دلخواه خود را برای GPU بنویسید ، بله. لازم نیست 1 رقم را در هر آرایه ذخیره کنید. شما باید تا حد امکان (معمولاً 32 بیت) ذخیره کنید.
چگونه اضافه می کنید؟شما فقط هر عنصر را به هم اضافه می کنید و در صورت سرریز شدن به عنصر بعدی منتقل می شوید. برای تفریق ، اگر زیر جریان باشد ، از عنصر بعدی وام می گیرید.
چگونه ضرب می کنید؟مانند مدرسه کلاس - شما هر عنصر را توسط عنصر یکدیگر ضرب می کنید ، سپس آنها را در پایین اضافه می کنید.
چگونه تقسیم می کنید؟خوشبختانه ، در محاسبه مجموعه Mandelbrot ، هیچ تقسیم بندی وجود ندارد. پس زحمت نکشید.
برای مجموعه Mandelbrot به طور خاص ، یک الگوریتم تقریبی سریعتر وجود دارد که فقط به عنوان "الگوریتم تئوری آشفتگی" شناخته می شود.
الگوریتم تئوری آشفتگی رویکردی برای محاسبه تقریباً مجموعه مندلبروت برای یک دسته از نقاط در نزدیکی است. ابتدا یک نقطه به نام نقطه مرجع را انتخاب می کنید ، و آن را با استفاده از الگوریتم معمول ، با ریاضیات دقیق خودسرانه محاسبه می کنید. نقطه مرجع باید یک پیکسل سیاه باشد ، یا حداقل باید بیشتر از هر پیکسل دیگر روی صفحه نمایش بیشتر شود.< Pan> چگونه اضافه می کنید؟شما فقط هر عنصر را به هم اضافه می کنید و در صورت سرریز شدن به عنصر بعدی منتقل می شوید. برای تفریق ، اگر زیر جریان باشد ، از عنصر بعدی وام می گیرید.
ویدیو های آموزشی فارکس...
ما را در سایت ویدیو های آموزشی فارکس دنبال می کنید
برچسب :
نویسنده : محبوب امانی
بازدید : 54
تاريخ : پنجشنبه
24 فروردين
1402 ساعت: 16:56