en EN   ru RU   uk UK

Головна

ОС A2

Знайомство

Локалізація

UDP-чат

Проксі-сервер

IFS

Демки

Ігри

Трасування променів

Екранна клавіатура

RegExp

ДРАКОН

Arduino

Програми

Утиліти

Посилання

Веб-майстру

Зв'язок з автором

Резюме


A2 OS forum

 
  Версія для друку

3D рендеринг в операційної системі A2


SAGE

Вихідні тексти уроків з сайта www.scratchapixel.com

Уявляю Вашому увазі вихідні тексти уроків з сайта www.scratchapixel.com, перенені на Active Oberon. При портировании з C++ використана можливість перевантаження операторів присутня в мові Active Oberon. Нить досягнута з використанням концепції активних об'єктів.

Урок 1. Алгоритм зворотної трасування променів

Сцена відрендерене з використанням алгоритму зворотної трасування променів


антиалиасинг

На основі коду даного уроку, в якості експерименту реалізований алгоритм одноуровневого адаптивного антиалиасинга.

Суть алгоритму полягає в знаходженні проблемних пікселів на кордонах об'єктів. Потім колір таких пікселів уточнюється шляхом змішання з квітами чотирьох суб-пікселів з урахуванням їх ваги. Для більше якісного антиалиасинга можна уточнювати колір і самих суб-пікселів виробляючи їх поділ на ще більше дрібні елементи, однак було вирішено обмежиться суб-піксельним рівнем.

Знаходження проблемних пікселів було вирішено виробляти шляхом обчислення відстані між кольором кожного пікселя і квітами сусідніх з ним пікселів в колірному прострастве, аналогічно тому, як обчислюється відстань між точками в тривимірному просторі. В випадку якщо колірне відстань хоч з одним з сусідніх пікселів перевищує заданий порогове значення, піксель вважається проблемним.

Результат виявлення проблемних пікселів при пороговому значенні рівному 0.05:

Сцена з знайденими проблемними пікселями, вимагають уточнення кольору

Добре видно, що таке порогове значення дає хороший запас і в число проблемних пікселів потрапляє багато пікселів без видимих​​ артефактів аліасинга. Граничне значення цілком можна підвищити.

Далі для всіх проблемних пікселів обчислюються і трасуються чотири додаткових променя, проходять через центри суб-пікселів. Обчислюється усереднений колір суб-пікселів і щодо нього обчислюються колірні відстані для їх кольорів. Обчислюються ваги по принципом: колір суб-пікселя з найбільшим відстанню від усередненого кольори має найбільший вагу.

Далі обчислюється усереднений вага суб-пікселів з урахуванням ваг і результат усредняется з вичесленной раніше кольором пікселя.

Результат роботи алгоритму виглядає досить непогано при тому що для його досягнення було відтрасувати завсе 28000 променів додатково. Таким чином для рендеринга сцени було відтрасувати близько 1.09 променів на кожен піксель.

Результат роботи алгоритму антиалиасинга:

Результат роботи алгоритму антиалиасинга

антиалиасинг в 2D графіці

Досвід отриманий від експериментів з адаптивним антіаліасігом знайшов успішне застосування і для антиалиасинга в 2D графіці. BohdanT модифікував модуль WMClock для малювання більше симпатичних стрілок в режимі аналогових годин, але результат хоч і був непоганим, всю картину псувало присутність ефекту аліасинга зображення стрілок. Я вирішив продемонструвати принципову можливість використання адаптивного антиалиасинга і в даному випадку. Причому багаторівневий адаптивний антиалиасинг тепер реалізований повністю, і є завдання число його рівнів. Ось результат роботи алгоритму:

Результат роботи алгоритму антиалиасинга в 2D графіці


Урок 6. Перетин променя з трикутником

Колір в точці перетину&​​#32заданий барицентрична координатами:

Колір в точці перетину&​​#32заданий барицентрична координатами


Трикутник зафарбований кольором, повченим інтерполяцією кольору вершин:

Трикутник зафарбований кольором, отриманим інтерполяцією кольору вершин

Варто привести кілька міркувань по приводу поліпшення продуктивності. Автори уроків в тексті теж неодноразово цей питання піднімають. Я зробив невеликою бенчмарк на основі коду lesson6b.Mod, демонструє залежність тривалості обчислень від розміру елементарного фрагмента оброблюваних даних bucketSize. Враховувалося тільки час витрачений на безпосередні обчислення в паралельних потоках.

Результати бенчмарка (параметри системи: одноядерний P4 3,400 GHz з технологією HyperThreading, WinAos rev. 1567), час обчислень для завсе фрейма 640x480 пікселів, в миллисекундах:

Bucket size:    32 Time elapsed:  1208
Bucket size:    64 Time elapsed:   623
Bucket size:   128 Time elapsed:   335
Bucket size:   256 Time elapsed:   203
Bucket size:   512 Time elapsed:   157
Bucket size:  тисячадвадцятьчотири Time elapsed:  &Повідомлення:#32160

Потім, тип LONGREAL був замінений на REAL, і відповідно, імпортований модуль Math замість MathL. Після компіляції і повторного запуску результати були наступними:

Bucket size:    32 Time elapsed:   858
Bucket size:    64 Time elapsed:   446
Bucket size:   128 Time elapsed:   235
Bucket size:   256 Time elapsed:   143
Bucket size:   512 Time elapsed:   110
Bucket size:  1024 Time elapsed:   111

Як видно з результатів, на такий простий сцені немає абсолютно ніякого сенсу в розбивсяі фрейма на мінімальні фрагметов. І розбиття на потоки з наявністю технології HyperThreading теж Не дало відчутного приросту продуктивності. Природно, на інших, більше складних сценах і на другом устаткуванні картина можеть бути інша.

Ще бенчмарк показав, що переважніше використання типу REAL.

Модуль lesson6bench.Mod з використанням типу REAL включений в архів з вихідними текстами до уроку.


Урок 7. Примітиви

Результат роботи алгоритму знаходження перетину&​​#32променя з сферою геометричним методом


Адаптивний антиалиасинг + многопоточность + SSE оптимізація

Після тривалого перерви, знайшлося час повністю переписати код прикладів 1 і 6. Результати в Raytracer.zip. Адаптивний антиалиасинг тепер реалізований повністю. Багатопотоковий код тепер став реально багатопотоковим, що видно по бенчмарк. Таксамо, присутні SSE оптимізації обчислень. SSE оптимізації винесені окремо, при необхідності їх можна включити, помінявши lib := Lib3D на lib := Lib3D_SSE в секції імпорту. По бенчмарк видно, що SSE оптимізації Не дають відчутного приросту продуктивності, оскільки використовуються unaligned варіанти SSE команд. Тобто ще є що оптимізувати :)

Результати бенчмарка (параметри системи: AMD A10-7850K Radeon R7, 12 Compute Cores 4C+8G @ 3.70 GHz (4 cores, 4 threads)).

Lesson1, без SSE:

nThreadsTotal: 1, bucket size: 640 x 480, nBucketsTotal: 1, time elapsed:   1.2909
nThreadsTotal: 2, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.7199
nThreadsTotal: 4, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.3787

Lesson1, SSE:

nThreadsTotal: 1, bucket size: 640 x 480, nBucketsTotal: 1, time elapsed:   1.0590
nThreadsTotal: 2, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.5875
nThreadsTotal: 4, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.3032

Lesson6, без SSE:

nThreadsTotal: 1, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.2253
nThreadsTotal: 2, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.1196
nThreadsTotal: 4, bucket size: 80 x 60, nBucketsTotal: 64, time elapsed:   0.0673

Lesson6, SSE:

nThreadsTotal: 1, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.1826
nThreadsTotal: 2, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.0976
nThreadsTotal: 4, bucket size: 80 x 60, nBucketsTotal: 64, time elapsed:   0.0541

Lesson6, швидкий алгоритм перетину&​​#32трикутника з лучем (Möller-Trumbore), без SSE:

nThreadsTotal: 1, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.2030
nThreadsTotal: 2, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.1079
nThreadsTotal: 4, bucket size: 80 x 60, nBucketsTotal: 64, time elapsed:   0.0592

Lesson6, швидкий алгоритм перетину&​​#32трикутника з лучем (Möller-Trumbore), SSE:

nThreadsTotal: 1, bucket size: 320 x 240, nBucketsTotal: 4, time elapsed:   0.1565
nThreadsTotal: 2, bucket size: 160 x 120, nBucketsTotal: 16, time elapsed:   0.0826
nThreadsTotal: 4, bucket size: 80 x 60, nBucketsTotal: 64, time elapsed:   0.0451

Результати роботи алгритмів. С антіаліасігом набагато симпатичніше!



Тип

Ім'я

Розмір

Завантажень

zip

ScratchAPixelLesson1.zip

12 KiB

495

zip

ScratchAPixelLesson6.zip

22 KiB

476

zip

ScratchAPixelLesson7.zip

14 KiB

506

zip

AA2DGraphics.zip

10 KiB

522

zip

Raytracer.zip

25 KiB

495

Дата останнього оновлення: 23-2-20 15:44:51


 

alt CodeTyphon

Copyright © 2005-2020 SAGE. Всі права захищено.