了解OpenGL ES:CATransform3DScale而不是glScalef?

时间:2011-09-03 02:02:59

标签: ios opengl-es core-animation

所以,我今天晚上正在接受OpenGL ES,正在研究一些示例代码,以便成为他们的代表。我目前正在绘制一个多维数据集并遇到两种做法(看似)同样的事情:

方法#1(更详细)

CATransform3D currentCalculatedMatrix = CATransform3DIdentity;
CATransform3D scaleTransform = CATransform3DScale(currentCalculatedMatrix, 2.0f, 2.0f, 1.0f);
GLfloat currentModelViewMatrix[16];
[self convert3DTransform:&scaleTransform toMatrix:currentModelViewMatrix];
glLoadMatrixf(currentModelViewMatrix);

方法#2(更少代码)

glScalef(2.0f, 2.0f, 1.0f);

现在,似乎在这两个例子中,我的立方体现在大了100%。我想知道,在什么情况下我想使用缩放我的ModelView矩阵的方法#1而不是简短而甜蜜的方法#2?在我非常简单的例子中,似乎两种方法都做完全相同的事情。

1 个答案:

答案 0 :(得分:1)

在ES 1.0中,这两位代码几乎完全相同。 glScalef被定义为将当前矩阵乘以缩放矩阵。 glLoadMatrixf被定义为用指定的矩阵替换当前矩阵(glMultMatrixf将当前矩阵与指定的矩阵相乘而不是替换它。假设你从堆栈上的单位矩阵开始,那么你最终会得到相同的结果,因为你自己生成它时会提供一个缩放矩阵。

所以在ES 1.0中,后者对于紧凑性是有利的,因为它使你所做的更加明显。在最新的变换中乘以而不是替换任何变换的方法通常也是处理几何体的层次结构的更简洁的方法。

然而,矩阵堆栈已从ES 2.0中删除,您可以完全依靠自己的方式进行操作。因此,如果您考虑将来为ES 2.0编写代码,那么使用可以实际构建矩阵的代码可能是值得的。苹果已经宣布推出适用于iOS 5的GLKit,它可能会处理这类样板,但我们不会知道,直到iOS 5超出NDA,他们添加的任何东西显然都只能在iOS 5上使用。