Некорректный вопрос. Тот функционал в шейдере, которым ты заменяешь стандартную FFP-часть очевидно не будет реагировать на установку этих стейтов.
Ну например GL_TEXTURE_ENV - ты же в шейдере их будешь смешивать.
Но можно использовать встроенные юниформы, чтобы сохранить работоспособность фиксированного функционала в собственном шейдере.
Обнаружил неприятный баг на радеонах - у тонких треугольников низкая точность интерполяции вариингов.
На примере плинтуса. Передаю мировую позицию вершины через вариинг во фрагментный шейдер, и вывожу как цвет, вот какая дрянь получается. И еще похоже, что оно как-то завязано на перспективную коррекцию, потому что количество артефактов зависит от ракурса и расстояния до камеры.
На жифорсах и интелах такого нет, всё гладенькое, как и ожидалось.
Есть идеи, как забороть? Как-то вручную можно интерполировать?
Добавлено 23-06-2020 в 00:59:
Придумал корочи получать мировые координаты фрагмента через gl_FragCoord и обратную матрицу проекции. Вроде даже работает.
Добавлено 23-06-2020 в 01:30:
Надо сказать, что хоть при использовании такого способа артефакты и отсутствуют, но точность результата не высокая. Поэтому рад буду услышать альтернативные предложения.
ncuxonaT писал: у тонких треугольников низкая точность интерполяции вариингов
как-то ты неправильно сформулировал. У линейной интерполяции точность не может быть низкой или высокой. Там что-то другое. А глубина не 16 бит случайно?
nemyax пробовал, никаких изменений. Дядя Миша может, и неправильно. Глубина 24 бита, но я пробовал и 16, и 32F, и 32F с Reversed-Z, никак оно не влияет.
Обратил внимание, что артефакты лезут в том случае, если часть вершин треугольника лежит позади передней плоскости отсечения,
Дядя Миша маловероятно, я же везде явно флоаты прописываю. И для рейтрейсинга все координаты во флоат текстуре хранятся. Если бы вершины были в халфах, то было бы много самопересечений, ну то есть лучи с поверхности халф-треугольника попадали бы в тот же флоат-треугольник. Но такого не наблюдается, артефачат только узкие треугольники. И только на радеонах.
Дядя Миша из интернета. Результат похож на правду, но точность заметно хуже, чем у интерполяции. Я хочу понять, это из-за неверного кода или из-за недостатка точность флоатов.
Я в своё время, когда задавался этим вопросом перепробывал разные способы и вот у них тоже была какая-то очень низкая точность. Наилучший результат получился с Screen Rays, можешь в параное посмотреть.
Там надо четыре луча предрассчитать.