Vertex to Pixel Shader TEXCOORD вопросы точности интерполяции
Я думаю, что у меня возникают проблемы с точностью в пиксельном шейдере при чтении текстовых координат, которые были интерполированы из вершинного шейдера.
Моя сцена состоит из нескольких очень больших треугольников (длина ребер до 5000 единиц, и текстовых координат в диапазоне от 0 до 5000 единиц, так что текстура выложена мозаикой около 5000 раз), и у меня есть камера, которая смотрит очень близко к одному из этих треугольников (камера может быть настолько близко, что ее видовой экран покрывает только пару метров больших треугольников). Когда я перемещаю камеру по плоскости треугольника, текстура запаздывает и скачет. Я думаю, что я испытываю недостаток точности в интерполированных текстовых координатах.
Есть ли способ повысить точность интерполяции texcoords?
Первым делом я хотел, чтобы texcoord u хранился с двойной точностью в xy-компонентах, а texcoord v в zw-компонентах. Но я думаю, что это не сработает, так как интерполяция шейдеров предполагает, что есть 4 отдельных 8-битных компонента, а не 2 16-битных компонента?
Если на стороне шейдера нет решения, я думаю, мне просто придется тесселить треугольники на более мелкие кусочки? Я бы не хотел этого делать только из-за этой проблемы. Есть идеи?
РЕДАКТИРОВАТЬ: Проблема также видна при печати texcoords в виде цветов на экране, без какой-либо фактической выборки текстуры вообще.
1 ответ
Вы правы, это похоже на проблему точности. Если ваша карта поддерживает это, вы действительно можете использовать поплавки двойной точности для интерполяции. Просто объявите переменные как dvec2, и это должно работать.
Шейдерная интерполяция не предполагает наличия 4 отдельных 8-битных компонентов. В последних картах каждый скаляр (т.е. компонент в vec) интерполируется отдельно как число с плавающей запятой (или двойное число). Старые карты, которые могли только интерполировать vec4s, также работали с полными числами с плавающей запятой (но эти, вероятно, не поддерживают двойные).