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

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

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

Здравствуйте, товарищи!
Возникла у меня странная проблема. OpenGL, рисую меш, мне нужно во фрагментном шейдере знать мировые координаты фрагмента, поэтому передаю из вершинного значение gl_Vertex через varying. На узких длинных треугольниках возникают артефакты. Такое впечатление, что не хватает точности при интерполяции.
Теперь с иллюстрациями. Рисую плинтус, выглядит он следующим образом:
Изображение
А вот мировые координаты, выведенные в цвет:
Изображение
Если подлететь ближе, артефакты исчезают:
Изображение
Опытным путем установил, что артефакты лезут в том случае, если часть вершин треугольника находится позади ближней плоскости отсечения. На видео это более-менее видно:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

На джифорсах и интелах эта проблема не наблюдается, только на радеонах.
Кто-нибудь с таким сталкивался? Есть идеи, как забороть?


#1
23:51, 23 июня 2020

ncuxonaT
> На джифорсах и интелах эта проблема не наблюдается
У них тоже есть такая проблема, только треугольники нужно сильнее вытянуть.

> Кто-нибудь с таким сталкивался? Есть идеи, как забороть?
Как-то настроил построение геометрии в геом шейдере и использовал noperspective для текстурных координат. Еще был нюанс, что на мировую матрицу надо было умножать в вершинном шейдере, а в геом только проецировать, иначе не работало.

В общем правильный вариант не делать такую геометрию, все остальное это костыли.

#2
(Правка: 10:16) 10:16, 24 июня 2020

Так же еще бывает что треугольники мерцают.

У Projection matrix есть near\far
Надо подобрать near и far.

Я делал near=3.0 и far = 3000.0

#3
(Правка: 17:09) 17:09, 24 июня 2020

/A\
> У них тоже есть такая проблема, только треугольники нужно сильнее вытянуть.

Вот такая? (GeForce 1060)

+ Показать

Верхняя линия теоретически тоже однопиксельная, как нижние, только у неё один конец позади камеры.

#4
22:01, 24 июня 2020

Хм, ну раз нет адекватного способа это дело исправить, то, может, можно как-то иначе получать мировые координаты фрагмента? Я пробовал через gl_FragCoord и обратную матрицу, но точность результата оставляет желать лучшего.

#5
2:53, 25 июня 2020

ncuxonaT
> Хм, ну раз нет адекватного способа это дело исправить
ncuxonaT
> На узких длинных треугольниках возникают артефакты
???
не делать узких длинных треугольников?

вообще скрин в первом посте мне напомнил мой баг https://community.amd.com/thread/249742

#6
14:23, 25 июня 2020

Danilw
Всё же хотелось бы иметь возможность работать с любой геометрией.

А ваш баг не может быть вызван неадекватной работой HyperZ?

#7
14:57, 25 июня 2020

ncuxonaT
фаски черезмерно сглажены, там не нужно столько поликов, лучше прорядить лупы и пустить полики на поперечное разбиение плинтуса\карниза\молдинга (и уже не будут такие длинные\узкие треугольники).

#8
15:14, 25 июня 2020

точности нифатат

#9
16:31, 25 июня 2020

ncuxonaT
> Всё же хотелось бы иметь возможность работать с любой геометрией.
>
>
треугольник/квад не должен быть больше экрана, когда он больше и будут потери - это обычная практика

очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096 (4к текстура макс)
в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах конечно не всегда так)

#10
18:24, 25 июня 2020

Danilw
>
> треугольник/квад не должен быть больше экрана, когда он больше и будут потери -
> это обычная практика
>
> очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096
> (4к текстура макс)
> в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах
> конечно не всегда так)
Никогда о таком не слышал, откуда эта информация? Макс разрешение текстуры 4к - это же было 20 лет назад.

Ruslan
> фаски черезмерно сглажены, там не нужно столько поликов, лучше прорядить лупы и
> пустить полики на поперечное разбиение плинтуса\карниза\молдинга (и уже не
> будут такие длинные\узкие треугольники).
Это понятно, но я делаю что-то типа рендера для архивиза, поэтому нужно без артефактов выводить любую геометрию.

#11
18:28, 25 июня 2020

>Это понятно, но я делаю что-то типа рендера для архивиза, поэтому нужно без артефактов выводить любую геометрию.
сочувствую

>gl_FragCoord и обратную матрицу, но точность результата оставляет желать лучшего.
И в чём выражается эта неточность? Скрины результатов кривой точности будут?

#12
18:30, 25 июня 2020

Danilw
> треугольник/квад не должен быть больше экрана, когда он больше и будут потери -
> это обычная практика
>
> очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096
> (4к текстура макс)
> в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах
> конечно не всегда так)

А если у меня нет текстур, то норм будет?

#13
(Правка: 18:39) 18:39, 25 июня 2020

>Есть идеи, как забороть?
Попробовать ещё можно: резать треугольники в геометрическом/тесселирующем шейдере. Запускать такой шейдер только для объектов, которые на экране много места занимают.

#14
18:43, 25 июня 2020

samrrr
> Скрины результатов кривой точности будут?
вот разница между интерполированными и восстановленными координатами х128

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