У меня проблема с использованием GLshort для представления вершин и нормальных
Когда мой проект приближается к стадии оптимизации, я замечаю, что сокращение метаданных Vertex может значительно повысить производительность 3D-рендеринга.
В конце концов, я очень долго искал и нашел следующие советы от stackru.
Использование GL_SHORT вместо GL_FLOAT в массиве вершин OpenGL ES
Как вы представляете координату нормали или текстуры, используя GLshorts?
Советы по ускорению OpenGL ES 1.1 на iPhone
Простые эксперименты показывают, что переключение с "FLOAT" на "SHORT" для вершин и нормалей не сложно, но меня беспокоит то, что когда вы уменьшаете вершины до их первоначального размера (с помощью glScalef), нормали умножаются на обратную масштаба. Естественным средством для этого является умножение нормалей на шкалу перед отправкой в GPU. Тогда мои короткие нормали почти становятся 0, потому что масштабный коэффициент обычно меньше 0. Дух!
Как вы используете "короткий" как для вершины, так и для нормальной одновременно? Я пробовал это и то около полного дня, но я мог пока идти только для "float vertex w/ byte normal" или "short vertex w/ float normal".
Ваша помощь будет по достоинству оценена.
2 ответа
Разве вы не можете просто нормализовать свои нормальные, называя это?
glEnable( GL_NORMALIZE );
Это не идеально, потому что нормализация, вероятно, немного затронет графический процессор, но на самом деле это зависит от того, вызвано ли ваше узкое место передачей данных в графический процессор или тем, что графический процессор слишком много делает. Как и при любой оптимизации, вам нужно выяснить, что дает лучшую скорость. Я подозреваю, что вы, вероятно, замедлились, передав данные вершин, так что вы получите ускорение.
Возможные вещи, чтобы попробовать:
- попытаться противостоять масштабированию, возясь с матрицей GL_NORMAL
- используйте вершинный шейдер для выполнения вычислений по вашему желанию
- не уменьшайте ваши данные вершин, вместо этого увеличивайте матрицы камеры