Зачем существуют GLint и GLfloat?

Я понимаю, что Open GL должен использовать числа, но почему бы просто не использовать обычные целые числа и числа с плавающей запятой или уже существующие классы-оболочки (в зависимости от того, что необходимо для того, чтобы весь мир Open GL хорошо сочетался)? Есть ли разница, помимо имени и того, что используется исключительно в Open GL, или это почти одно и то же с другим именем?


person Slayer0248    schedule 07.09.2012    source источник


Ответы (1)


Потому что int (упрощение здесь) 32 бита в 32-битной системе и 64 бита в 64-битной системе, поэтому даже просто «int» не является универсальной концепцией. Имейте в виду, что аппаратное обеспечение, на котором работает графический код, отличается от вашего процессора, и возникает потребность в новых типах. Используя собственный typedef, OpenGL может гарантировать, что правильное количество битов будет правильно упаковано при отправке данных на вашу видеокарту.

Это можно было бы сделать с помощью функций преобразования, которые абстрагируются от беспорядка «разных целых чисел», но это повлекло бы за собой снижение производительности, что обычно неприемлемо, когда вы говорите о каждом отдельном числе, поступающем на видеокарту и от нее.

tl; dr при использовании «int» вы пишете с учетом аппаратного обеспечения вашего процессора. При использовании «GLInt» вы пишете с учетом аппаратного обеспечения вашей видеокарты.

РЕДАКТИРОВАТЬ: как указано в комментариях, на 64-битном процессоре int может (и, вероятно, будет) 32-битным по соображениям совместимости. Исторически сложилось так, что для 8-, 16- и 32-битного оборудования это был собственный размер процессора, но технически это то, что компилятор хочет использовать при создании машинного кода. Реквизит @Nicol Bolas и @Mark Dickinson

person Matt    schedule 07.09.2012
comment
int равно (упрощенно здесь) 32 бита в 32-битной системе и 64 бита в 64-битной системе. Примечание: это не обязательно правильно. Компилятор решает, насколько большим будет int. Он может быть 32-битным в 64-битной системе. Это может быть не так. - person Nicol Bolas; 08.09.2012
comment
@NicolBolas: +1. На самом деле, мне трудно представить себе какие-либо 64-битные системы, в которых int является 64-битным. Все распространенные системы, о которых я знаю, имеют 32-битные целые числа. По крайней мере, если мы говорим о целых числах C/C++, т.е. Кажется, я припоминаю, что некоторые древние Crays имели 64-битные целые числа. - person Mark Dickinson; 08.09.2012
comment
Вы знаете, это правда, спасибо за комментарии - я думал о int как о нативном адресуемом размере, недавно проведя некоторое время во встраиваемых системах, но оказалось, что int был 16 бит на 16-битном процессоре, 32 на 32-битная и... 32-битная на 64-битной. Он был сохранен как 32-битный из соображений совместимости. Я только что проверил это на своем x86 MBP. Это подчеркивает, что int может быть любым, каким хочет его видеть компилятор, усиливая аргумент в пользу необходимости надежного типа для аппаратного обеспечения видеокарты, но заслуживает комментариев и редактирования. Хорошо сделано! - person Matt; 08.09.2012
comment
Потрясающий ответ! Быстрый вопрос, есть идеи, почему opengl не использовал uint32_t и uint64_t, как определено в ‹stdint.h›? Спрашиваю, потому что очень неудобно включать весь заголовок OpenGL только для GLuint и так далее. - person Verdagon; 24.12.2013
comment
вы не ответили, для чего используется GLfloat. - person Beyondo; 14.03.2018