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

SSLR

Страницы: 1 2 Следующая »
#0
13:24, 7 ноя. 2018

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


#1
13:28, 7 ноя. 2018

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

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

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

+ Показать

#3
13:48, 7 ноя. 2018

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

#4
13:50, 7 ноя. 2018

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

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

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

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

#6
13:59, 7 ноя. 2018

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

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

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
Все понял как сделать
#8
14:06, 7 ноя. 2018

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

#9
14:10, 7 ноя. 2018

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

#10
14:14, 7 ноя. 2018

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

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

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

+ Показать
#12
(Правка: 17:57) 17:57, 8 ноя. 2018

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;
        }             
    }
#13
(Правка: 18:27) 18:26, 8 ноя. 2018

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);
    }
#14
(Правка: 19:12) 19:09, 8 ноя. 2018

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

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

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

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