替换glPush / PopMatrix

时间:2012-02-18 15:56:10

标签: opengl

我确实认识到许多平台不支持glPush / Pop矩阵函数(所以不要拍我)但是有谁知道如何在不破坏现有代码库的情况下替换它们?< / p>

2 个答案:

答案 0 :(得分:4)

其实非常简单。每次推动矩阵时,只需将其与堆栈中的一个相乘即可。您可以非常简单地编写自己的推/弹矩阵堆栈。字面上是一组用于ModelView,Projection和Texture的矩阵,然后每次调用push矩阵时,只需将Mprev * Mcurr推到堆栈顶部即可。当你弹出时,你只是回到上一个矩阵。

答案 1 :(得分:3)

由于这些funcs在许多平台和新核心版本上已被弃用以及固定功能,因此您必须将矩阵作为制服提供给您自己的着色器(必需)。 无论平台如何,gl_ModelViewMatrixgl_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();
    }
};