2015-06-29 2 views
0

Я думаю, что у меня возникают проблемы с точностью в пиксельном шейдере при чтении текскодов, которые были интерполированы из вершинного шейдера.Vertex to Pixel Shader Точные ошибки интерполяции TEXCOORD

Моя сцена состоит из очень больших треугольников (краев длиной до 5000 единиц, а текс-коконов от 0 до 5000 единиц, так что текстура выложена около 5000 раз), и у меня есть камера, которая выглядит очень закройте один из этих треугольников (камера может быть настолько близка, что ее видовое окно охватывает только пару метров больших треугольников). Когда я панорамирую камеру по плоскости треугольника, текстура отстает и нервна. Моя мысль заключается в том, что я испытываю недостаток точности на интерполированных texcoords.

Есть ли способ повысить точность интерполяции texcoords?

Моим первым было то, что texcoord u хранится с двойной точностью в xy-компонентах и ​​texcoord v в zw-компонентах. Но я думаю, что это не сработает, поскольку интерполяция шейдеров предполагает наличие 4 отдельных 8-битных компонентов, а не 2 16-битных компонентов?

Если на стороне шейдера нет решения, я полагаю, что мне нужно будет только привязать треугольники к более мелким кускам? Я бы не хотел делать это только для этой проблемы. Любые идеи?

РЕДАКТИРОВАТЬ: Проблема также видна при печати texcoords в виде цветов на экране без каких-либо фактических отборов текстуры вообще.

+1

Вы подтвердили, что точность тегов с плавающей запятой на самом деле является проблемой? Я не уверен, что это так, но позвольте мне догадаться: при выборке текстуры координаты текстуры преобразуются в _fixed point_, как правило, с 8 бит дробной точности. Это означает, что существует только 256 _discrete_, эквидистантных местоположений между двумя текселями, где вы можете пробовать. Или, другими словами: вы получите артефакты бандажей, если увеличите текстуру более чем на 256 раз. – derhass

+0

У меня была аналогичная проблема несколько дней назад. Я остановил полосу, сделав текстуру больше (но да, это очень глупое решение). Любые советы о том, как избежать проблемы @derhass? – Jerem

+0

Проблема не в выборке текстур. Я попытался просто выводить координаты uv в возвращаемый пиксельный шейдер COLOR без какой-либо выборки текстур и все еще получал такую ​​же проблему. –

ответ

1

Вы правы, это похоже на проблему с высокой точностью. Если ваша карта поддерживает его, вы действительно можете использовать поплавки с двойной точностью для интерполяции. Просто объявите переменные как dvec2, и он должен работать.

Шейдерная интерполяция не предполагает наличия 4 отдельных 8-битных компонентов. В последних картах каждый скаляр (т.е. компонент в vec) интерполируется отдельно как float (или double). Старые карты, которые могли только интерполировать vec4s, также работали с полными поплавками (но эти, вероятно, не поддерживают удвоения).

+0

Хорошо. Это синтаксис GLSL? Я использую cg. Переход от float2 к double2 компиляции, но вызывает те же проблемы.После некоторого тестирования я узнал, что cg может рассматривать double как float, подтвержденный здесь: «Cg позволяет профайлам пропускать поддержку во время выполнения для int и других целочисленных типов. Cg позволяет профилям обрабатывать double как float». [Ссылка] (http://http.developer.nvidia.com/Cg/Cg_language.html). Я мог бы быть на слишком низком профиле (ps_3_0), но, похоже, перегрузок не происходит в любом месте cg api. Во всяком случае, я пробовал тесеть сетку, и это работает сейчас. Спасибо за ответ. –

+0

Я немного смущен о вашем последнем абзаце. Просто чтобы было ясно; могу ли я решить проблему точности интерполяции, если у меня старая карта/профиль, который не поддерживает dvec2? –

+1

Что я имел в виду, так это то, что все карты (старые и новые) используют 32 (или 24) бита для вычисления интерполяции (и не менее). Но, по-видимому, 32-битных поплавков недостаточно в вашем случае, поэтому тесселяция является единственным решением. – Jerem

Смежные вопросы