在OpenGL 3.x中如何正确地做到这一点?

时间:2011-08-28 16:50:03

标签: opengl glsl

谷歌搜索之后,我只有这个空间来问你下一个问题。

我正在尝试编写一个简单的OpenGL 3.x示例来学习如何使用新的可编程管道(着色器)。这个tutorial非常有用(并且使用过剩来保持简单,正如你所看到的那样)并且很好地作为起点。但是,当我试图使用预定义的过剩物体(茶壶ie)并尝试以旧的和弃用的方式移动或旋转时,噩梦和问题开始glScalefglTranslatefglRotatefglLoadIdentityglMultMatrixfglPushMatrixglPopMatrix ...),但是现在对我来说是不可能的。

如果我试图使用带有平移的方便的变换矩阵,它会全局移动整个场景(两个或多个对象旋转,不仅是一个,即),而不是局部。我在这里找到了类似的question,但仍然一团糟......(仅适用于vbos?场景中的每个对象都必须有一个独特的着色器?,... )

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

2 个答案:

答案 0 :(得分:12)

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

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

所有物体移动的原因是因为您没有在绘制两个物体之间重置制服。制服是从OpenGL设置的着色器中的数据,但在单个glDraw*调用中不会更改着色器的多次执行。以前的GL版本中的矩阵函数有效地设置了等效的制服。因此,只需将这些功能转换为统一设置即可。

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

答案 1 :(得分:3)

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

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