Как вы представляете координату нормали или текстуры, используя GLshorts?
Многие предложения по улучшению производительности в играх для iPhone связаны с отправкой меньшего количества данных в графический процессор. Очевидное предложение состоит в том, чтобы использовать GLshorts вместо GLfloat везде, где это возможно, например, для вершин, нормалей или текстурных координат.
Каковы особенности при использовании GLshort для координаты нормали или текстуры? Можно ли представить координату текстуры GLfloat равной 0,5 при использовании GLshort? Если так, как ты это делаешь? Будет ли это просто SHRT_MAX/2? То есть диапазон от 0 до 1 для GLfloat отображается на 0 на SHRT_MAX при использовании текстурной координаты GLshort?
Как насчет нормалей? Я всегда создавал нормали с помощью GLfloats и нормализовал их до единичной длины. Когда вы используете GLshort для нормали, отправляете ли вы ненормализованный вектор в графический процессор? Если да, то когда и как это нормализуется? Делением на все компоненты по SHRT_MAX?
3 ответа
нормативы
если ты 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 (для листов). Там нет никакого способа указать дробные значения между ними.
Однако не забывайте о матрице текстур. Возможно, вы сможете использовать его для преобразования целых чисел в полезные текстурные координаты. (Я не пробовал.)
В спецификации 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);
Я успешно использовал GLshorts в качестве текстурных координат, умножив их на 1000 при создании VBO, затем разделив на 1000 перед использованием в шейдере. Конечно, вам придется взвесить дополнительные вычисления против увеличения памяти на вашем устройстве.
При поиске Googling, как использовать GLshort для повышения производительности, это очень важно, но извиняюсь за публикацию в таком старом потоке.