我是初学OpenGL和图形编程的新手,虽然我一直对这个主题感兴趣,所以在理论上有一个基础.
我想要做的是创建一个场景,其中一组对象移动.具体来说,他们是一个场上的机器人足球运动员.对象是:
照明,场地和目标,不会改变
球,是一个单一的网格,将进行平移和旋转,但不会缩放
每个球员都由身体部位组成,每个身体部位都被翻译和旋转,以产生连体的幻觉
所以对于我的GL新手来说,我想将这些对象加载到场景中然后移动它们.顶点的属性不会改变,无论是它们的定位还是纹理/法线/等.只是整个'父母'对象的转变.
此外,球员都有相同的身体.我可以通过将模型加载到内存中一次,然后每次使用不同的转换矩阵多次绘制它来进行优化吗?
我目前正在使用OpenTK,这是一个在OpenGL库之上的轻量级包装器.
所以这个问题的有用答案可能是:
OpenGL的哪些部分给了我我需要的东西?我是否必须每帧重绘所有脸部?只是那些移动?我可以更新一些转换矩阵吗?使用OpenTK我能做到这么简单吗?psuedocode会是什么样子?要么,
是否有一个更好的框架是免费的(理想的开源)并提供这种抽象级别?
请注意,我需要在多个平台上运行.NET的任何解决方案.
使用所谓的顶点数组可能是优化这种场景的最可靠方法.这是一个很好的教程:
http://www.songho.ca/opengl/gl_vertexarray.html
顶点数组或更一般地,gl数据数组保存诸如顶点位置,法线,颜色之类的数据.您还可以使用一个数组来保存这些缓冲区的索引,以指示绘制它们的顺序.
然后你有一些密切相关的函数来管理这些数组,分配它们,设置数据并绘制它们.您只需使用一个OpenGL命令即可执行复杂网格的渲染glDrawElements()
这些数组通常驻留在主机内存上.进一步的优化是使用顶点缓冲区对象,这些对象与常规数组相同,但驻留在GPU内存上并且速度稍快.这是关于那个:
http://www.songho.ca/opengl/gl_vbo.html
使用缓冲区而不是旧版本glBegin() .. glEnd()
具有与OpenGL ES兼容的优点.在OpenGL ES中,数组和缓冲区是绘制内容的唯一方法.
--- 编辑
使用模型视图矩阵移动,旋转它们并在场景中变换它们,并且不需要对网格数据进行任何更改.为了显示:
你有你的初始化:
void initGL() { // create set of arrays to draw a player // set data in them // create set of arrays for ball // set data in them } void drawScene { glMatrixMode(GL_MODEL_VIEW); glLoadIdentity(); // set up view transformation gluLookAt(...); drawPlayingField(); glPushMatrix(); glTranslate( player 1 position ); drawPlayer(); glPopMatrix(); glPushMatrix(); glTranslate( player 2 position ); drawPlayer(); glPopMatrix(); glPushMatix(); glTranslate( ball position ); glRotate( ball rotation ); drawBall(); glPopMatrix(); }