Повысить точность в DirectX с позициями высокого диапазона? - PullRequest
5 голосов
/ 16 февраля 2011

Я создаю небольшую игру на C ++ с DirectX 9 со случайно созданным миром, и у меня возникла проблема, когда игрок далеко ушел от 3D-происхождения (0,0,0). 3D-рендеринг стал очень неточным, вызывая визуальные проблемы. Я думаю, это потому, что значения, посылаемые шейдеру, являются числами с плавающей точкой, и числа с плавающей точкой становятся менее точными при увеличении. Я думаю о решении переместить все модели вместо перемещения камеры, но это делает более расчетливым, я боюсь, что возможное снижение производительности.

Есть ли выход для решения этой проблемы?

Спасибо

Ответы [ 3 ]

4 голосов
/ 16 февраля 2011

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

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

Если у вас все еще есть проблемы с точностью, будет гораздо дешевле, скажем, использовать двойную точность для генерацииодна матрица на плитку / объект, чем указывать координаты для каждой точки вашего ландшафта.

Обратите внимание, что это поднимает проблему переключения источников при переходе от плитки к плитке.Это досадно и досадно, но что-то в этом роде, вероятно, неизбежно, если вы хотите, чтобы мир был больше ваших чисел с плавающей запятой!

0 голосов
/ 16 февраля 2011
0 голосов
/ 16 февраля 2011

Это очень распространенная проблема в индустрии видеоигр

Вы можете привязать сгенерированные точки к фиксированной сетке, чтобы избежать проблем с округлением.затем вы можете отрегулировать плотность сетки, чтобы получить правильный баланс между недостаточной точностью и визуальными сбоями.

Хорошо также, чтобы ваше начало координат было в центре вашей карты.

...