2011-08-28 50 views
4

经过Google搜索很多,我只有这个空间来问你下一个问题。在OpenGL 3.x中如何做到这一点?

我想编写一个简单的OpenGL 3.x的样品,以了解如何工作的新的可编程管线(着色器)。这个tutorial真的很有用(并且使用glut来保持简单,正如你所看到的)并且作为一个出发点。但是,噩梦和问题开始当我试图使用预定义的对象过剩(即茶壶),并试图在本地方式像旧的和过时的方式(移动或旋转glScalefglTranslatefglRotatefglLoadIdentityglMultMatrixfglPushMatrixglPopMatrix ...),但现在对我来说是不可能的。

如果我试图做的是使用一个方便的转换矩阵配有翻译,它在全球移动整个场景(两个或两个以上的物体转动,不只有一个,即),而不是本地的。我发现这个类似question这里,但仍处于一片混乱......(只与维也纳组织工作?场景中的每个对象都必须有一个独特的着色器? ...)

我不知道我是否已经清楚解释。我发现关于这个主题的每个教程总是使用单个对象。如果有人知道任何写得很好的教程或示例代码来解释这一点,我将非常感谢您的帮助。

+0

你'glPushmatrix();的glTranslatef();画(); glPopMatrix();'? (当matrixmode设置为'GL_MODELVIEW')当然,正如你所指出的,这是不推荐的方式。 – Nobody

回答

12

我会认为,当你说“的OpenGL 3.x的”,你的意思是core OpenGL 3.1 or greater。也就是说,您没有使用兼容性上下文。

首先,你不能使用GLUT的预定义的对象了。你也不能使用glu的预定义对象。如果这对你来说太过于限制,那么我建议你创建一个兼容性上下文。

原因你所有的物体运动是因为你没有重新绘制两个对象之间的制服。制服是在OpenGL中设置的着色器中的数据,但不会因单个glDraw*调用中的着色器的多次执行而发生变化。以前的GL版本中的矩阵函数有效地设置了等价的制服。所以只需将这些功能转换为统一的设置。

如果你想查看使用GL 3.X核心的教程系列,那么你可以看看my tutorial series

+0

非常感谢!我会阅读你有趣的教程。另一方面,对于每个开始看到这个简单例子的人来说,这将是很好的和有益的;-) – xbelanch

3

这里的关键是,你需要保持自己的transfomration heirachy。 glPushMatrix在活动堆栈上创建当前矩阵的副本,然后应用应用于堆栈的一些转换。然后绘制东西,他们会收到这种转变。 glPopMatrix在层次上向前迈进了一步。

在制服的情况下,你不再有矩阵堆栈。因此,不是使用glPushMatrix创建当前变换级别矩阵的副本,而是应用子变换并将该新矩阵加载到统一中。