我确实认识到许多平台不支持glPush / Pop矩阵函数(所以不要拍我)但是有谁知道如何在不破坏现有代码库的情况下替换它们?< / p>
答案 0 :(得分:4)
其实非常简单。每次推动矩阵时,只需将其与堆栈中的一个相乘即可。您可以非常简单地编写自己的推/弹矩阵堆栈。字面上是一组用于ModelView,Projection和Texture的矩阵,然后每次调用push矩阵时,只需将Mprev * Mcurr推到堆栈顶部即可。当你弹出时,你只是回到上一个矩阵。
答案 1 :(得分:3)
由于这些funcs在许多平台和新核心版本上已被弃用以及固定功能,因此您必须将矩阵作为制服提供给您自己的着色器(必需)。
无论平台如何,gl_ModelViewMatrix
,gl_ModelViewProjectionMatrix
和其他内置制服都会从GLSL中移除,并且在所有新的OpenGL(核心)版本中都有固定功能。
因此,决策不应该基于平台,因为所有新的核心配置文件都不再具有这些功能。替换它需要一些努力,但会提高所有平台的可移植性,更重要的是,(向前)与新平台的兼容性。 实现客户端矩阵堆栈也不是那么难。
编辑:请参阅此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();
}
};