Войти
ПрограммированиеФорумГрафика

SSLR

Страницы: 1 2 Следующая »
#0

Как написать нормальный SSLR на SM3.0? Сначала сделал обычный raymarhing без бинарного поиска, все было хорошо. Но вот решил добавить бинарый поиск и все стало печально. Компилятор разворачивает внутренний цикл и производительность страдает, и при этом минутная компиляция

7 ноя. 2018

#1

IBets
> бинарного поиска
От куда там поиск то бинарный?

7 ноя. 2018

#2

vindast
Ну ты шагаешь на расстояние distance(currentRayPosition, positionCurrentDepth). Настанет момент когда, текущее значение глубины луча будет больше чем в z-buffere, и тебе необходимо будет уточнить бинарным поиском. Вот 30 итераций, пока косяки не исправлял

+ Показать

7 ноя. 2018 (Правка: 13:46)

#3

IBets, посмотри лучше сюда:
https://gamedev.ru/code/forum/?id=237345
Особенно на qdm. Если ты можешь сгенерить мип-уровни для буфера глубины, то проблем с ним быть не должно. (на первый взгляд).
Вот сам я сяду за это дело в ближайшее время.

7 ноя. 2018

#4

IBets, только я так и не понял где там бинарный поиск, по тому что глубина в общем случае значение не предсказуемое.

7 ноя. 2018

#5

vindast
Я пока не хочу навороченный с mip-map уровнями. Я хочу простой, но [loop] не робит пишет, что я юзаю частные производные хотя их не использую

https://www.youtube.com/watch?v=K2rs7K4y_sY&t=142s

7 ноя. 2018 (Правка: 13:59)

#6

IBets, там верные значения будут только на плоских поверхностях, а на сложной геометрии будут артефакты. Можно сделать проще для такого случая, как в статье на хабре.
Бинарным поиском он только называется, по тому что он не сходится к верному решению. 

7 ноя. 2018

#7

vindast
В месте где break начинается бинарный поиск для уточнения. По моему тоже самое что и в статье до этого момента

    for (int i = 0; i < 30; i++) {
        intersect += factor * direction;
        float3 texcoord = TexcoordFromPosition(intersect, MatrixProjection);
        float depth = tex2D(SamplerDepth, texcoord.xy);
        if (texcoord.z < depth) {         
            break;
        }
        factor = distance(PositionFromDepth(texcoord.xy, depth, MatrixResPosition), intersect);

    }

Затем в бинарном поиске я делаю так

for (int j = 0; j < 3; j++) {
    texcoord = TexcoordFromPosition(intersect, MatrixProjection);
    depth = tex2D(SamplerDepth, texcoord.xy);
    direction *= 0.5;
    intersect += direction * ((texcoord.z < depth) ? 1 : -1);
}
update
Все понял как сделать

7 ноя. 2018 (Правка: 14:07)

#8

IBets
> Затем в бинарном поиске я делаю так
Твой трассировщик может проскакивать через тонкие штуки. Если тебе на них плевать, то возьми алг от сюда, https://habr.com/post/244367
Этот алг такой же убогий, но более быстрый.

7 ноя. 2018

#9

vindast
Ты сравни до бинарного поиска, это то же самое не? Он считает в world space, а я в view space и все

7 ноя. 2018

#10

Блин. У тебя вот тут отражение сам в себя.
Изображение

7 ноя. 2018

#11

vindast
Это просто стена там угол нормали направлен в направлении камеры и поэтому вообще ничего не должно быть

+ Показать

7 ноя. 2018 (Правка: 14:19)

#12

vindast
Способ описанный в статье очень медленный, но дает хорошие результаты. Проблема в двух умножениях матрицы в цикле. Поменял на на движение в screen space, но данный метод очень плохо сходится

    float3 positionVS = PositionFromDepth(Texcoord,  tex2D(SamplerDepth, Texcoord).r, MatrixResPosition);
    float3 reflectVS = reflect(normalize(positionVS), normalize(cross(ddy(positionVS), ddx(positionVS))));
     
    float3 positionSS = TexcoordFromPosition(positionVS, MatrixProjection);
    float3 directionSS = normalize(TexcoordFromPosition(positionVS + 10.0f * reflectVS, MatrixProjection) - positionVS);
   
   
    bool isIntersect = false;
    float3 intersect = positionSS;
    for (int i = 0; i < 32; i++) {
        intersect += 0.01 * directionSS;
        float depth = tex2D(SamplerDepth, intersect.xy).r;
        if (intersect.z < depth) {
            isIntersect = true;
            break;
        }             
    }

8 ноя. 2018 (Правка: 17:57)

#13

vindast
Модернизировал до такого, сходится быстро но надо как то ввести зависимость от Z_NEAR и Z_FAR

 float3 positionVS = PositionFromDepth(Texcoord,  tex2D(SamplerDepth, Texcoord).r, MatrixResPosition);
    float3 reflectVS  = reflect(normalize(positionVS), normalize(cross(ddy(positionVS), ddx(positionVS))));
     
    float3 positionSS = TexcoordFromPosition(positionVS, MatrixProjection);
    float3 directionSS = normalize(TexcoordFromPosition(positionVS + 10.0f * reflectVS, MatrixProjection) - positionSS);
   
   
    bool isIntersect = false;
    float factor = 0.01;
    float3 intersect = positionSS;
    for (int i = 0; i < 32; i++) {
        intersect += factor * directionSS;
        float depth = tex2D(SamplerDepth, intersect.xy).r;
        if (intersect.z < depth) {
            isIntersect = true;
            break;
        }    
        factor = abs(depth - intersect.z);
    }

8 ноя. 2018 (Правка: 18:27)

#14

IBets 32 итерации, на тех скринах что я кидал, их 10) Я тоже переводил расчеты в ss. Короче, вот через неделю присоединюсь к треду.

IBets
> for (int i = 0; i < 32; i++) {
Аж зубы скрипят

IBets
> for (int i = 0; i < 32; i++)
>{

8 ноя. 2018 (Правка: 19:12)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика