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

Артефакты интерполяции у узких треугольников на радеонах (или нет) (2 стр)

Страницы: 1 2 3 Следующая »
#15
(Правка: 18:53) 18:49, 25 июня 2020

ncuxonaT
А если сузить near/far plane лучше становится?

Выглядит вообще странно, каким кодом восстанавливаются координаты?


#16
19:02, 25 июня 2020

samrrr
> А если сузить near/far plane лучше становится?
Если отодвигать near, то немного лучше. Если приближать far, то примерно то же самое.
samrrr
> каким кодом восстанавливаются координаты?
вполне вероятно, что неправильным

vec4 ndc = vec4(gl_FragCoord.xyz / vec3(screen_size, 1.0) * 2.0 - vec3(1.0) , 1.0); 
ndc = inverse_mvp * ndc;
vec3 fixed_pos = ndc.xyz / ndc.w;
#17
19:29, 25 июня 2020

>gl_FragCoord.xyz / vec3(screen_size, 1.0) * 2.0 - vec3(1.0)
можно +0.5 пикселя сделать, может лучше будет.

ещё есть такая вещь как inverse depth
при нём матрица становится лучше.

>inverse_mvp
На cpu же эти матрицы в double считаются?

#18
(Правка: 19:48) 19:43, 25 июня 2020

samrrr
> можно +0.5 пикселя сделать, может лучше будет.
> ещё есть такая вещь как inverse depth
> при нём матрица становится лучше.
Увы, ни то ни другое не помогает (матрицу с обратной глубиной брал отсюда https://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html).
samrrr
> На cpu же эти матрицы в double считаются?
Хм, вообще я обратную матрицу считал в вершинном шейдере как inverse_mvp = inverse(gl_ModelViewProjectionMatrix);
Думаете, есть смысл проверить на даблах?
upd. Попробовал в шейдере считать через dmat4, всё то же самое

#19
20:03, 25 июня 2020

ncuxonaT
> Увы, ни то ни другое не помогает (матрицу с обратной глубиной брал отсюда
Одной матрицы мало будет

#20
20:07, 25 июня 2020

АкронимЛета
сколько матриц будет достаточно?

#21
20:14, 25 июня 2020

ncuxonaT
> сколько матриц будет достаточно?
Ты диапазон отсечения глубины менял при inverse depth?

#22
20:29, 25 июня 2020

АкронимЛета
если имеется в виду glDepthRangedNV(-1.0,1.0), то да, менял

#23
20:32, 25 июня 2020

>glDepthRangedNV(-1.0,1.0)
это не inverse, а хрень какая-то получается

#24
20:34, 25 июня 2020

>upd. Попробовал в шейдере считать через dmat4, всё то же самое
уже поздно, при рассчёте матрицы надо double а не только при инверсии

#25
(Правка: 22:09) 22:04, 25 июня 2020

ncuxonaT
ты пытаешься пофиксить то что невозможно пофиксить

Danilw
> треугольник/квад не должен быть больше экрана, когда он больше и будут потери -
> это обычная практика
>
> очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096

я тебе сказал причину
у тебя UV растягивается что шейдер получает значения UV с потерями точности

посмотри на размер своего треугольника/квада и прикинь сколько размеров экрана он занимает(в камере, когда смотришь на него в большинстве ситуаций)
ну и сделай так чтоб он был в пределах размера одного экрана разбив на части....

#26
22:16, 25 июня 2020

>ты пытаешься пофиксить то что невозможно пофиксить
это возможно пофиксить

#27
(Правка: 17:12) 17:11, 29 июня 2020

Не уверен, что догнал в описание проблемы, опенгл не мое. Но на всякий случай, если "нужно во фрагментном шейдере знать мировые координаты фрагмента", то может перед всеми вычислениями из позиции вертекса убрать позицию камеры, а потом в пиксельном шейдере добавить? (из трансформаций матриц лучше тоже)

#28
0:30, 30 июня 2020

BorisV
Не поможет. Всё, что передается из вершинного шейдера во фрагментный, криво интерполируется. Никак же нельзя повлиять на интерполяцию?

samrrr
Попробовал считать матрицу на даблах, эффект незначительный. Сделал нормальную reversed depth с использованием glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE), стало намного лучше, но всё равно есть разница с нормальными интерполированными значениями. Сомневаюсь, что можно добиться лучшего результата таким подходом с умножением gl_FragCoord на обратную матрицу.

+ Показать
#29
0:51, 30 июня 2020

ncuxonaT
> Никак же нельзя повлиять на интерполяцию?
А как ты хочешь на неё повлиять?

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