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. Перетин променя з трикутником

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

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


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

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

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

 Результати бенчмарка (параметри системи: одноядерний P4 3,400 GHz з технологією HyperThreading,&n bsp;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 1024 Time elapsed: 160 

 Потім, тип 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 e lapsed: 111 

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

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

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


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

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


Адаптивний антиалиасинг + многопоточность + 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,&n bsp;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, швидкий алгоритм перетину трикутника з лучем (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, швидкий алгоритм перетину трикутника з лучем (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

428

zip

ScratchAPixelLesson6.zip

22 KiB

416

zip

ScratchAPixelLesson7.zip

14 KiB

410

zip

AA2DGraphics.zip

10 KiB

454

zip

Raytracer.zip

25 KiB

432

Дата останнього оновлення: 31-5-19 16:55:29


 

alt CodeTyphon

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