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

xbe*_*nch 4 opengl glsl

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

我正在尝试编写一个简单的OpenGL 3.x示例来学习如何使用新的可编程管道(着色器).本教程非常有用(并且使用过剩来保持简单,如您所见)并且很好地作为起点.但是,噩梦和问题开始当我试图使用预定义的过剩对象(即茶壶),并试图在本地方式像旧的和过时的方式移动或旋转(glScalef,glTranslatef,glRotatef,glLoadIdentity,glMultMatrixf,glPushMatrixglPopMatrix...),但现在这对我来说是不可能的.

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

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

Nic*_*las 12

我会假设,当你说"OpenGL 3.x"时,你的意思是核心OpenGL 3.1或更高版本.也就是说,您没有使用兼容性上下文.

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

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

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