Поскольку эти функции устарели вместе с фиксированной функцией на многих платформах и в новых версиях ядра, вы должны предоставить матрицы для своего собственного шейдера (обязательно) в виде униформ.
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();
}
};