OpenGL: как отменить масштабирование? - PullRequest
0 голосов
/ 21 сентября 2010

Я новичок в OpenGL.Я использую JOGL.

У меня есть класс WorldEntity, который представляет вещь, которую можно визуализировать.Он имеет такие атрибуты, как position и size.Для рендеринга я использовал этот метод:

    /**
     * Renders the object in the world.
     */
    public void render() {
        gl.glTranslatef(getPosition().x, getPosition().y, getPosition().z);
        gl.glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
//        gl.glScalef(size, size, size);

        gl.glCallList(drawID);

//        gl.glScalef(1/size, 1/size, 1/size);
        gl.glRotatef(-getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
        gl.glTranslatef(-getPosition().x, -getPosition().y, -getPosition().z);
    }

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

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

Как правильно поступить?Могу ли я найти менее сложный способ отменить преобразование масштабирования?Нужно ли сортировать объекты по масштабу и рисовать их, чтобы уменьшить требуемые преобразования масштабирования?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 21 сентября 2010

Здесь вы используете матрицы (потерпите меня, я из опыта программирования OpenGL / C):

glMatrixMode(GL_MODELVIEW); // set the matrix mode to manipulate models

glPushMatrix(); // push the matrix onto the matrix stack

// apply transformations
glTranslatef(getPosition().x, getPosition().y, getPosition().z);
glRotatef(getRotationAngle(), getRotation().x, getRotation().y, getRotation().z);
glScalef(size, size, size);

glCallList(drawID); // drawing here

glPopMatrix(); // get your original matrix back

... по крайней мере, я так думаю.

0 голосов
/ 21 сентября 2010

Очень маловероятно, что подразделения вызовут какие-либо проблемы с производительностью. rfw дал вам обычный способ реализации этого, но я предполагаю, что ваш «вялый» рендеринг в основном связан с тем, что ваш GPU является узким местом, и использование матричных стеков не улучшит производительность.

Когда вы увеличиваете размер нарисованных объектов, нужно обрабатывать больше пикселей, и графический процессор должен работать значительно тяжелее. То, что ваш процессор делает в этот момент (подразделения), не имеет значения.

Чтобы доказать мою точку зрения, попробуйте сохранить код масштабирования, но с размерами около 1.

...