Понимание OpenGL ES: CATransform3DScale вместо glScalef? - PullRequest
0 голосов
/ 03 сентября 2011

Итак, сегодня вечером я использую OpenGL ES и прорабатываю некоторый пример кода, чтобы познакомиться с ним.В настоящее время я рисую куб и столкнулся с двумя способами сделать (казалось бы) одно и то же:

Метод № 1 (более подробный)

CATransform3D currentCalculatedMatrix = CATransform3DIdentity;
CATransform3D scaleTransform = CATransform3DScale(currentCalculatedMatrix, 2.0f, 2.0f, 1.0f);
GLfloat currentModelViewMatrix[16];
[self convert3DTransform:&scaleTransform toMatrix:currentModelViewMatrix];
glLoadMatrixf(currentModelViewMatrix);

Метод № 2 (намного меньше кода)

glScalef(2.0f, 2.0f, 1.0f);

Теперь, похоже, что в обоих этих примерах мой куб теперь стал на 100% больше.Мне интересно, в каких ситуациях я бы хотел использовать метод № 1 для масштабирования моей ModelView матрицы, а не метод коротких и сладких № 2?В моем очень простом примере кажется, что оба метода точно делают то же самое.

1 Ответ

1 голос
/ 03 сентября 2011

В ES 1.0 эти два бита кода делают почти одно и то же.glScalef определяется для умножения текущей матрицы на масштабирующую матрицу.glLoadMatrixf определено для замены текущей матрицы на указанную (glMultMatrixf будет умножать текущую матрицу на указанную, а не заменять ее).Предполагая, что вы начинаете с матрицы идентификаторов в стеке, вы в результате получаете тот же результат, учитывая, что вы сами задаете масштабирующую матрицу.

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

Однако стек матриц удален из ES 2.0, и вам остаетсяпостоять полностью самостоятельно.Так что, если вы думаете о написании кода для ES 2.0 в будущем, вероятно, стоит иметь код, который действительно может построить ваши матрицы.Apple объявила о выпуске GLKit для iOS 5, который, вероятно, имеет дело с подобными шаблонами, но мы не узнаем, пока iOS 5 выйдет из NDA, и все, что они добавят, будет очевидно доступно только для iOS 5.

...