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

На джифорсах и интелах эта проблема не наблюдается, только на радеонах.
Кто-нибудь с таким сталкивался? Есть идеи, как забороть?
ncuxonaT
> На джифорсах и интелах эта проблема не наблюдается
У них тоже есть такая проблема, только треугольники нужно сильнее вытянуть.
> Кто-нибудь с таким сталкивался? Есть идеи, как забороть?
Как-то настроил построение геометрии в геом шейдере и использовал noperspective для текстурных координат. Еще был нюанс, что на мировую матрицу надо было умножать в вершинном шейдере, а в геом только проецировать, иначе не работало.
В общем правильный вариант не делать такую геометрию, все остальное это костыли.
Так же еще бывает что треугольники мерцают.
У Projection matrix есть near\far
Надо подобрать near и far.
Я делал near=3.0 и far = 3000.0
/A\
> У них тоже есть такая проблема, только треугольники нужно сильнее вытянуть.
Вот такая? (GeForce 1060)
Верхняя линия теоретически тоже однопиксельная, как нижние, только у неё один конец позади камеры.
Хм, ну раз нет адекватного способа это дело исправить, то, может, можно как-то иначе получать мировые координаты фрагмента? Я пробовал через gl_FragCoord и обратную матрицу, но точность результата оставляет желать лучшего.
ncuxonaT
> Хм, ну раз нет адекватного способа это дело исправить
ncuxonaT
> На узких длинных треугольниках возникают артефакты
???
не делать узких длинных треугольников?
вообще скрин в первом посте мне напомнил мой баг https://community.amd.com/thread/249742
Danilw
Всё же хотелось бы иметь возможность работать с любой геометрией.
А ваш баг не может быть вызван неадекватной работой HyperZ?
ncuxonaT
фаски черезмерно сглажены, там не нужно столько поликов, лучше прорядить лупы и пустить полики на поперечное разбиение плинтуса\карниза\молдинга (и уже не будут такие длинные\узкие треугольники).
точности нифатат
ncuxonaT
> Всё же хотелось бы иметь возможность работать с любой геометрией.
>
>
треугольник/квад не должен быть больше экрана, когда он больше и будут потери - это обычная практика
очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096 (4к текстура макс)
в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах конечно не всегда так)
Danilw
>
> треугольник/квад не должен быть больше экрана, когда он больше и будут потери -
> это обычная практика
>
> очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096
> (4к текстура макс)
> в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах
> конечно не всегда так)
Никогда о таком не слышал, откуда эта информация? Макс разрешение текстуры 4к - это же было 20 лет назад.
Ruslan
> фаски черезмерно сглажены, там не нужно столько поликов, лучше прорядить лупы и
> пустить полики на поперечное разбиение плинтуса\карниза\молдинга (и уже не
> будут такие длинные\узкие треугольники).
Это понятно, но я делаю что-то типа рендера для архивиза, поэтому нужно без артефактов выводить любую геометрию.
>Это понятно, но я делаю что-то типа рендера для архивиза, поэтому нужно без артефактов выводить любую геометрию.
сочувствую
>gl_FragCoord и обратную матрицу, но точность результата оставляет желать лучшего.
И в чём выражается эта неточность? Скрины результатов кривой точности будут?
Danilw
> треугольник/квад не должен быть больше экрана, когда он больше и будут потери -
> это обычная практика
>
> очевидно в OpenGL размер шага в пиксельном шейдере не должен быть ниже 1/4096
> (4к текстура макс)
> в Vulkan это 1/16384 (зависит от карты конечно, на мобилках и АМД и Интелах
> конечно не всегда так)
А если у меня нет текстур, то норм будет?
>Есть идеи, как забороть?
Попробовать ещё можно: резать треугольники в геометрическом/тесселирующем шейдере. Запускать такой шейдер только для объектов, которые на экране много места занимают.
samrrr
> Скрины результатов кривой точности будут?
вот разница между интерполированными и восстановленными координатами х128
Тема в архиве.