由于OpenGL是一个状态机,我在程序中不断地使用glEnable()和glDisable()。有一些调用只在开始时进行(例如glClearColor),但大多数情况下我会根据需要开启或关闭它们(例如光照,取决于我是渲染模型、3D文本还是GUI)。
您如何跟踪这些状态呢?每次函数调用前都重置它们吗?那不是很多不必要的开销吗?
例如,在编写新函数时,有时我知道在调用函数时状态的位置,我就会在函数顶部省略glEnable或glDisable等相关状态切换调用。其他时候,我事先编写函数并添加这些内容。因此,我的函数变得非常混乱,有些修改OpenGL状态,而其他一些则只做出假设(后来被打破,然后我必须回去弄清楚为什么某个东西变成了黄色,或者为什么另一个东西颠倒了等等)。
在面向对象的环境中,您如何跟踪OpenGL跨函数的使用呢?
此问题也与如何知道何时使用push和pop以及何时只需设置值有关。
例如,假设您有一个程序,绘制一些3D内容,然后绘制一些2D内容。显然,在每种情况下投影矩阵都不同。那么您会:
1.设置一个3D投影矩阵,绘制3D;设置一个2D投影矩阵,绘制2D,循环
2.在程序中设置一个3D投影矩阵;然后绘制3D,push矩阵,绘制2D,pop矩阵,循环
您会选择哪个方法?为什么?
您如何跟踪这些状态呢?每次函数调用前都重置它们吗?那不是很多不必要的开销吗?
例如,在编写新函数时,有时我知道在调用函数时状态的位置,我就会在函数顶部省略glEnable或glDisable等相关状态切换调用。其他时候,我事先编写函数并添加这些内容。因此,我的函数变得非常混乱,有些修改OpenGL状态,而其他一些则只做出假设(后来被打破,然后我必须回去弄清楚为什么某个东西变成了黄色,或者为什么另一个东西颠倒了等等)。
在面向对象的环境中,您如何跟踪OpenGL跨函数的使用呢?
此问题也与如何知道何时使用push和pop以及何时只需设置值有关。
例如,假设您有一个程序,绘制一些3D内容,然后绘制一些2D内容。显然,在每种情况下投影矩阵都不同。那么您会:
1.设置一个3D投影矩阵,绘制3D;设置一个2D投影矩阵,绘制2D,循环
2.在程序中设置一个3D投影矩阵;然后绘制3D,push矩阵,绘制2D,pop矩阵,循环
您会选择哪个方法?为什么?