Замена glPush / PopMatrix - PullRequest
       1

Замена glPush / PopMatrix

1 голос
/ 18 февраля 2012

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

Ответы [ 2 ]

4 голосов
/ 18 февраля 2012

Это на самом деле довольно просто.Каждый раз, когда вы нажимаете матрицу, вы просто умножаете ее на единицу в стеке.Вы можете ОЧЕНЬ просто написать свой собственный стек матрицы push / pop.Буквально стек матриц для ModelView, Projection и Texture (s), а затем каждый раз, когда вы вызываете push matrix, просто помещаете Mprev * Mcurr в верхнюю часть стека.Когда вы щелкаете, вы просто возвращаетесь к предыдущей матрице.

3 голосов
/ 18 февраля 2012

Поскольку эти функции устарели вместе с фиксированной функцией на многих платформах и в новых версиях ядра, вы должны предоставить матрицы для своего собственного шейдера (обязательно) в виде униформ. gl_ModelViewMatrix, gl_ModelViewProjectionMatrix и другие встроенные формы удаляются из GLSL вместе с фиксированной функцией во всех новых версиях OpenGL (core), независимо от платформы.

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

РЕДАКТИРОВАТЬ: см. Этот пример шаблона C ++, который имитирует стек матрицы OpenGL. В нем отсутствуют математические математические реализации, не используется стек STL по причинам, которые здесь не видны, но показаны математические операции, которые необходимо выполнить:

РЕДАКТИРОВАТЬ 2: добавлена ​​проверка ошибок (1 элемент - минимальный размер стека)

template<typename T>
class MatrixStack
{
public:
    typedef T matrix_type;

private:
    std::vector<matrix_type> stack;

public:
    MatrixStack(void)
    {
        stack.push_back(matrix_type::identity());
    }

    void clear(void)
    {
        stack.clear();
        stack.push_back(matrix_type::identity());
    }

    size_t size(void) const
    {
        return stack.size();
    }

    void push(void)
    {
        matrix_type tmp = stack.back(); //required in case the stack's storage gets reallocated
        stack.push_back(tmp);
    }

    bool pop(void)
    {
        if (size() > 1)
        {
            stack.pop_back();
            return true;
        }
        else
        {
            return false;
        }
    }

    void load(const matrix_type& matrix)
    {
        stack.back() = matrix;
    }

    void loadIdentity(void)
    {
        load(matrix_type::identity());
    }

    void loadTransposed(const matrix_type& matrix)
    {
        load(transpose(matrix));
    }

    void mult(const matrix_type& matrix)
    {
        load(stack.back() * matrix);
    }

    void multTransposed(const matrix_type& matrix)
    {
        load(stack.back() * transpose(matrix));
    }

    const matrix_type& get(void) const
    {
        return stack.back();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...