Войти
ФлеймФорумПроЭкты

Я пишу несмещной пат-трейсер (4 стр)

Страницы: 13 4 5 611 Следующая »
#45
21:31, 5 дек. 2019

gamedevfor
> дело не в этом, все кому нужен трейсер думают что напишут свой трейсер лучше и
> еще продадут потом его другим, так и ходят "покупатели" каждый со своим
> трейсером.
Этo до тех пор, пока не придумают аппаратно-квантовый трейсер, который вместо груды математических вычислений будет в вакууме строить твою сцену и возвращать только снимок результата её зондирования! :-D


#46
22:46, 5 дек. 2019

Delfigamer
> Легит? По-моему, легит.
Похоже, похоже )
И сколько времени на кадр?

#47
22:51, 5 дек. 2019
Delfigamer
> Легит? По-моему, легит.
+ Напомнилoсь
#48
23:09, 5 дек. 2019

Delfigamer
> Легит? По-моему, легит.
Гамма-коррекцию сделал?

#49
23:31, 5 дек. 2019

блендеровские циклы для сравнения (стандартные диф. материал + эмиттер единичка):

+ Показать

#50
23:55, 5 дек. 2019

А стоп, у тебя стена светится или там источник света?

#51
(Правка: 0:32) 0:30, 6 дек. 2019

Zegalur
> А стоп, у тебя стена светится или там источник света?

Телепoрт же там! %-)
Просто, напомнило это
#52
1:00, 6 дек. 2019

Zegalur
> Похоже, похоже )
> И сколько времени на кадр?
Где-то часа четыре.

}:+()___ [Smile]
> Гамма-коррекцию сделал?
Так-то мог бы и сам найти, но да,

                float value = 10.0f * frame[width * iy + ix] / (iter * passrate);
                // float tm = value / (1.0f + value);
                float tm = 1.0f - expf(- value);
                int v = (int)(sqrtf(tm) * 255.0f);
                pixel[0] = v;
                pixel[1] = v;
                pixel[2] = v;
хоть и приближённо.

Zegalur
> А стоп, у тебя стена светится или там источник света?
У меня слишком тупой интегратор, чтобы работать с точечными источниками:

                    TraceRequest tr;
                    tr.origin = camera.mwc * FPoint{ 0, 0, 0 };
                    tr.dir = camera.mwc * FDisp{ cx * camera.utan, cy * camera.vtan, 1.0f };
                    while (geom.Trace(tr)) {
                        frame[width * iy + ix] += tr.face->emissive;
                        float q;
                        GenerateUniform(q);
                        if (tr.face->albedo < q) {
                            break;
                        }
                        tr.origin = tr.hit;
                        FDisp norm{
                            tr.face->mwt[2],
                            tr.face->mwt[6],
                            tr.face->mwt[10] };
                        GenerateLambertian(norm, tr.dir);
                    }
Так что да - это стена светится.
#53
1:12, 6 дек. 2019

Вообще, суть модели как раз в том, чтобы быть предельно простой - чтобы, если уж где-нибудь таки ошибся, эту ошибку было видно сразу и везде.
Вот, например, в процессе разработки, в генераторе точек на окружности я забыл привести каноничный [0;1) к диапазону [-1;1):

void RendererThread::GenerateCircle(float& u, float& v)
{
    while (true) {
        GenerateUniform(u);
        GenerateUniform(v);
     //   u = u * 2.0f - 1.0f;
     //   v = v * 2.0f - 1.0f;
        float uvsqr = u * u + v * v;
        if (uvsqr > 1.0f) {
            continue;
        }
        float inv = 1.0f / sqrtf(uvsqr);
        u *= inv;
        v *= inv;
        return;
    }
}
из-за чего GenerateLambertian теперь будет сэмплить только четверть полусферы; разумеется, картинка от этого сразу и очень заметно поедет:
Изображение
(время - пять минут, в течение которых я писал это сообщение)

А раз очевидных косяков нет, то, скорее всего, алгоритм верный... с точностью до постоянных коэффициентов (типа "светимость по физике домножается на коэффициент поглощения"), которые один фиг можно вогнать в единицы измерения и сказать "так и задумано".

#54
(Правка: 1:16) 1:16, 6 дек. 2019

Вот типа того, что я только что увидел при внимательном прочтении:

                        GenerateUniform(q);
                        if (tr.face->albedo < q) {
                            break;
                        }
"На самом деле 'альбедо' это 'один минус альбедо', очевидно же, так что тут нет никаких ошибок."
Как-то вот так.

#55
(Правка: 1:37) 1:29, 6 дек. 2019

Погоди.
Если альбедо - это на самом деле один минус альбедо...
(флешбек)

1. Полигоны разбираем на предмет наличия слова "light" в имени текстуры; если есть - ставим эмиссию 1 и альбедо 0; в противном случае - эмиссию 0 и...
...ставим эмиссию 1 и альбедо 0...
эмиссию 1
и альбедо 0

Ах, ругательства!

#56
2:19, 6 дек. 2019

Delfigamer
> Где-то часа четыре.
горшочек не вари.

#57
(Правка: 2:50) 2:50, 6 дек. 2019

...Или же всё-таки альбедо это альбедо? Давайте попробуем вырожденный случай. Если tr.face->albedo == 0, то... луч гарантированно поглощается. Изначально всё было правильно. Ну кроме разве что того, что вместо < правильнее написать <=.
Кароч, пойду замерять скорострельность и накачивать SIMD в трейсер, скорости много не бывает.

gamedevfor
> горшочек не вари.
u mad lol

#58
4:30, 6 дек. 2019

Окей, я пользуюсь ссешкой впервые в жизни.

struct FDisp
{
    __m128 m;
};

inline FDisp norm(FDisp const& a)
{
    __m128 asqr1 = _mm_mul_ps(a.m, a.m);               // xx, yy, zz, --
    __m128 asqr2 = _mm_shuffle_ps(asqr1, asqr1, 0x09); // yy, zz, xx, --
    __m128 asqr3 = _mm_shuffle_ps(asqr1, asqr1, 0x12); // zz, xx, yy, --
    __m128 asqr = _mm_add_ps(_mm_add_ps(asqr1, asqr2), asqr3);
    __m128 scale = _mm_rsqrt_ps(asqr);
    return FDisp{ _mm_mul_ps(a.m, scale) };
}
Я всё правильно делаю?

#59
5:00, 6 дек. 2019

Вoт же блин! Наверное, чувствуешь себя творцом?

Смотрю на твои скрины: В тёмной комнате куб светится.
И в голову приходит «В начале было…», так как реально - пространство появилось!

Как-то тоже пробовал писать трейсер, но по «своим понятиям»…
То есть, тупо брал луч и смотрел, с какими фигурами он пересекается.
Только не по стандартным этим (вашим) формулам, а чисто - как я сам это представлял и понимал.
То есть, функцией нахождения точки пересечения двух отрезков и проекцией 3D-объекта на плоскость определял, с чем пересекается в одной плоскости, а потом разворачивал всё и проецировал на перпендикулярную плоскость и снова искал пересечения. Если один объект давал положительный результат в обоих случаях - ставил на экране точку.
То есть, вертел всем, как Кубиком Рубика!

С чудовищно медленной скоростью!

Страницы: 13 4 5 611 Следующая »
ФлеймФорумПроЭкты