OpenGL заботится, работаю ли я с большими числами? - PullRequest
2 голосов
/ 18 января 2011

Например, я мог бы связать позиции, в которых я рисую свои сущности, на экране перед отправкой их в OpenGL - или: я даю OpenGL прямые координаты относительно игрового мира, которые, конечно, в гораздо большем масштабе.

  • Медленное ли рисование с большими координатами вершины?

Ответы [ 3 ]

5 голосов
/ 18 января 2011

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

Например, если ваша модель центрирована в (0,0,0) и имеет размер 10 x 10 x 10, тогда две точки на противоположных сторонах вашей модели находятся в (-5,-5,-5) и (5,5,5). Если та же модель центрирована на (1000,1000,1000), то ваши очки равны (995,995,995) и (1005,1005,1005).

Хотя абсолютная разница одинакова, разница относительно координат не равна.

Это может привести к ошибкам округления и отображению артефактов.

Вы должны расположить координаты моделей так, чтобы центр модели находился в (0,0,0).

5 голосов
/ 18 января 2011

Скорость больших значений будет такой же, как меньшие значения того же типа данных. Но если вам нужна точность, превышающая обычную 32-битную точность, и вы включаете что-то вроде GL_EXT_vertex_attrib_64bit , то это может привести к снижению производительности.

Допускаются большие значения, но следует обратить внимание на еще одну вещь, кроме стандартных проблем точности с плавающей запятой, - точность буфера глубины.

Точность глубины нелинейно распределена. Так что это более точно крупным планом и менее точно для вещей далеко. Поэтому, если вы хотите иметь возможность использовать широкий диапазон значений для координат вершин, имейте в виду, что вы можете увидеть артефакты z-борьбы, если вы собираетесь рендерить гигантские объекты очень далеко от камеры, очень маленькие вещи рядом с камерой. Установка ближних и дальних плоскостей отсечения как можно ближе к фактическим экстентам сцены поможет, но может оказаться недостаточной для решения проблемы. Подробнее см. http://www.opengl.org/resources/faq/technical/depthbuffer.htm,, особенно последние два пункта.

Кроме того, я знаю, что вы спрашивали о позициях вершин, но у координат текстуры могут быть дополнительные пределы точности помимо нормальных правил с плавающей точкой. Присвоение координате текстуры (9999999.5, 9999999.5) и ожидание ее правильного переноса в диапазон (0..1, 0..1) может работать не так, как вы ожидаете (в зависимости от реализации / оборудования).

3 голосов
/ 18 января 2011

Конвейер с плавающей запятой имеет постоянную скорость операций независимо от размера операндов.

Единственная опасность - получение аномально больших или малых чисел, когда ошибка выходит из-под контроля, и в результате вы получаете субнормальные числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...