Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / SSLR

SSLR

Страницы: 1 2 Следующая »
IBetsПользовательwww7 ноя. 201813:24#0
Как написать нормальный SSLR на SM3.0? Сначала сделал обычный raymarhing без бинарного поиска, все было хорошо. Но вот решил добавить бинарый поиск и все стало печально. Компилятор разворачивает внутренний цикл и производительность страдает, и при этом минутная компиляция
vindastПостоялецwww7 ноя. 201813:28#1
IBets
> бинарного поиска
От куда там поиск то бинарный?

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

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

vindastПостоялецwww7 ноя. 201813:48#3
IBets, посмотри лучше сюда:
https://gamedev.ru/code/forum/?id=237345
Особенно на qdm. Если ты можешь сгенерить мип-уровни для буфера глубины, то проблем с ним быть не должно. (на первый взгляд).
Вот сам я сяду за это дело в ближайшее время.
vindastПостоялецwww7 ноя. 201813:50#4
IBets, только я так и не понял где там бинарный поиск, по тому что глубина в общем случае значение не предсказуемое.
IBetsПользовательwww7 ноя. 201813:53#5
vindast
Я пока не хочу навороченный с mip-map уровнями. Я хочу простой, но [loop] не робит пишет, что я юзаю частные производные хотя их не использую

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

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

vindastПостоялецwww7 ноя. 201813:59#6
IBets, там верные значения будут только на плоских поверхностях, а на сложной геометрии будут артефакты. Можно сделать проще для такого случая, как в статье на хабре.
Бинарным поиском он только называется, по тому что он не сходится к верному решению. 

IBetsПользовательwww7 ноя. 201814:01#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

vindastПостоялецwww7 ноя. 201814:06#8
IBets
> Затем в бинарном поиске я делаю так
Твой трассировщик может проскакивать через тонкие штуки. Если тебе на них плевать, то возьми алг от сюда, https://habr.com/post/244367
Этот алг такой же убогий, но более быстрый.
IBetsПользовательwww7 ноя. 201814:10#9
vindast
Ты сравни до бинарного поиска, это то же самое не? Он считает в world space, а я в view space и все
vindastПостоялецwww7 ноя. 201814:14#10
Блин. У тебя вот тут отражение сам в себя.
Изображение

IBetsПользовательwww7 ноя. 201814:16#11
vindast
Это просто стена там угол нормали направлен в направлении камеры и поэтому вообще ничего не должно быть
+ Показать

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

IBetsПользовательwww8 ноя. 201817:57#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

IBetsПользовательwww8 ноя. 201818:26#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

vindastПостоялецwww8 ноя. 201819:09#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 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр