Dre*_*kes 4 language-agnostic opengl 3d graphics
我是初学OpenGL和图形编程的新手,虽然我一直对这个主题感兴趣,所以在理论上有一个基础.
我想要做的是创建一个场景,其中一组对象移动.具体来说,他们是一个场上的机器人足球运动员.对象是:
所以对于我的GL新手来说,我想将这些对象加载到场景中然后移动它们.顶点的属性不会改变,无论是它们的定位还是纹理/法线/等.只是整个'父母'对象的转变.
此外,球员都有相同的身体.我可以通过将模型加载到内存中一次,然后每次使用不同的转换矩阵多次绘制它来进行优化吗?
我目前正在使用OpenTK,这是一个在OpenGL库之上的轻量级包装器.
所以这个问题的有用答案可能是:
使用所谓的顶点数组可能是优化这种场景的最可靠方法.这是一个很好的教程:
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();
}
Run Code Online (Sandbox Code Playgroud)