2012-01-15 2 views
1

Мне нужно решить, следует ли использовать GL_UNSIGNED_SHORT или GL_FLOAT для моего (статического) VBO для вершин. Шорты используют в 2 раза меньше памяти, но также уменьшают скорость рендеринга (потому что графический процессор должен преобразовывать их в плавающие)? То же самое для текстурных координат я мог бы использовать GL_UNSIGNED_BYTE для меньших текстур и GL_UNSIGNED_SHORT для более крупных (с использованием текстурной матрицы для отображения до 0-1), но я беспокоюсь, что это может уменьшить скорость рендеринга.OpenGL VBO: короткий или плавающий?

ответ

3

Для любого современного оборудования (с поддержкой DX10 или лучше) вы можете предположить, что производительность чтения атрибутов всегда зависит от доступа к памяти, а не от преобразования из целого числа в float. По существу это бесплатно.

Это в основном относится к аппаратуре класса DX9, но некоторые аппаратные средства имеют определенные форматы вершин, с которыми он не работает.

Это, как говорится, я не был бы так уверен в возможности использовать беззнаковые байты для координат текстуры. В большинстве моделей вам обычно требуется большая точность, чем per-texel для координат текстуры. Неподписанные шорты, как правило, прекрасны, но в байтах просто недостаточно точности, чтобы заставить его работать.

+0

для моих целей беззнаковые байты будут работать отлично для текстур до 128x128, также что вы имеете в виду определенные вершинные форматы, не работают хорошо? (Я нацелен на OpenGL 2.0) – Jonathan

2

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

Но без фактического тестирования это не остается чем-то вроде дикой догадки.