如何在OpenGL3.x中正确地实现这一点?

如何在OpenGL3.x中正确地实现这一点?,opengl,glsl,Opengl,Glsl,在谷歌搜索了很多之后,我只有这个空间来问你下一个问题 我正在尝试编写一个简单的OpenGL3.x示例,以了解新的可编程管道(着色器)的工作原理。这真的很有帮助(如您所见,使用glut使事情保持简单),并且作为一个起点非常好。但是,当我试图使用预定义的glut对象(例如茶壶)并尝试像旧的和不推荐的方式那样以局部方式移动或旋转时,噩梦和问题就开始了(glScalef,GLTRANSTALEF,glRotatef,glLoadIdentity,glMultMatrixf,glPushMatrix和GL

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

我正在尝试编写一个简单的OpenGL3.x示例,以了解新的可编程管道(着色器)的工作原理。这真的很有帮助(如您所见,使用glut使事情保持简单),并且作为一个起点非常好。但是,当我试图使用预定义的glut对象(例如茶壶)并尝试像旧的和不推荐的方式那样以局部方式移动或旋转时,噩梦和问题就开始了(
glScalef
GLTRANSTALEF
glRotatef
glLoadIdentity
glMultMatrixf
glPushMatrix
GLPOPMARRIX
),但现在对我来说这是不可能的

如果我试图使用一个带有平移的方便变换矩阵来实现这一点,它会全局移动整个场景(两个或多个对象旋转,不只是一个,也就是说),但不会局部移动。我在这里发现了类似的情况,但仍然很混乱…(仅适用于vbos?场景中的每个对象都必须具有唯一的着色器?,…)


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

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

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

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


如果您想查看使用GL 3.x core的教程系列,那么您可以查看。

这里的关键是,您需要维护自己的转换继承机制。glPushMatrix在活动堆栈上创建当前矩阵的副本,然后应用一些应用于堆栈的转换。然后绘制他们将收到的转换内容信息。glPopMatrix在层次结构中更上一层楼


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

您是否
glPushMatrix();GLTRANSTAREF();Draw();GLPOPMARRIX();
?(matrixmode设置为
GL\u MODELVIEW
)当然,正如您所指出的,这是一种不推荐的方式。非常感谢!我将阅读您的一套有趣的教程。另一方面,对于每个开始看到这一简单示例的人来说,这将是非常好和有用的;-)