Как вы представляете координату нормали или текстуры, используя GLshorts? - PullRequest
2 голосов
/ 09 марта 2010

Множество предложений по улучшению производительности в играх для iPhone связаны с отправкой меньшего количества данных в графический процессор. Очевидное предложение - использовать GLshorts вместо GLfloat везде, где это возможно, например, для вершин, нормалей или текстурных координат.

Каковы особенности при использовании GLshort для координаты нормали или текстуры? Можно ли представить координату текстуры GLfloat равной 0,5 при использовании GLshort? Если так, как ты это делаешь? Будет ли это просто SHRT_MAX / 2? То есть, соответствует ли диапазон от 0 до 1 для карты GLfloat значению от 0 до SHRT_MAX при использовании координаты текстуры GLshort?

А как насчет нормалей? Я всегда создавал нормали с помощью GLfloats и нормализовал их до единичной длины. Когда вы используете GLshort для нормали, отправляете ли вы ненормализованный вектор в графический процессор? Если да, то когда и как это нормализуется? Делив на все компоненты по SHRT_MAX?

Ответы [ 3 ]

4 голосов
/ 10 марта 2010

В спецификации OpenGL ES 1.1 говорится, что нормали автоматически возвращаются в диапазон [-1: 1] или [0: 1] при использовании целочисленных типов. (См. Таблицу 2.7 спецификации для полного списка формул)

(for shorts)   n_x = (2c +1)/(2^16 − 1)

Так что вам не нужно полагаться на GL_NORMALIZE для нормалей (и вы можете использовать любой трюк, какой захотите).

Координаты текстуры, тем не менее, не масштабируются (значения вне диапазона [0: 1] совершенно допустимы ...). Если вы хотите применить такое масштабирование, лучше всего использовать матрицу координат текстуры по довольно значительной цене.

glMatrixMode(GL_TEXTURE);
glLoadMatrix(matrix_that_does_conversion_based_on_type);
3 голосов
/ 22 октября 2012

Я успешно использовал GLshorts в качестве текстурных координат, умножив их на 1000 при создании VBO, затем разделив на 1000 перед использованием в шейдере. Конечно, вам придется взвесить дополнительные вычисления с увеличением памяти на вашем устройстве.

При поиске в Google, как использовать GLshort для увеличения производительности, это очень важно, но извиняюсь за публикацию в такой старой теме.

2 голосов
/ 10 марта 2010

нормали

Если вы glEnable( GL_NORMALIZE ), то вы можете представить нормали как GL_BYTE (или короткое). Норма, представленная в байтах 0xFF 0xCC 0x33, нормализуется графическим процессором до (0,77, 0,62, 0,15).

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

Еще одна оговорка, связанная с GL_NORMALIZE, заключается в том, что вы не можете делать хитрость с помощью ненормализованных нормалей.

Редактировать: Под «хитростью» я подразумеваю настройку длины нормали в исходных данных (до значения, отличного от 1,0), чтобы сделать вертолет ярче или темнее.

Координаты текстуры

Насколько я могу судить, целые числа (байты или шорты) менее полезны для текстурных координат. Нет простого вызова, инструктирующего OpenGL «нормализовать» ваши текстурные координаты. 0 означает 0,0, 1 означает 1,0, а 255 означает 255,0 (для листов). Нет возможности указать дробные значения между ними.

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

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