我想写一个简单的迷宫游戏,不使用任何不赞成的OpenGL API(即没有即时模式)。我使用的是一个顶点缓冲区对象用于每个图块我有我的迷宫,这基本上是四个Vertex
个组合:OpenGL第一人称相机旋转和翻译
class Vertex {
public:
GLfloat x, y, z; // coords
GLfloat tx, ty; // texture coords
Vertex();
};
并储存在维也纳组织这样的:
void initVBO()
{
Vertex vertices[4];
vertices[0].x = -0.5;
vertices[0].y = -0.5;
vertices[0].z = 0.0;
vertices[0].tx = 0.0;
vertices[0].ty = 1.0;
vertices[1].x = -0.5;
vertices[1].y = 0.5;
vertices[1].z = 0.0;
vertices[1].tx = 0.0;
vertices[1].ty = 0.0;
vertices[2].x = 0.5;
vertices[2].y = 0.5;
vertices[2].z = 0.0;
vertices[2].tx = 1.0;
vertices[2].ty = 0.0;
vertices[3].x = 0.5;
vertices[3].y = -0.5;
vertices[3].z = 0.0;
vertices[3].tx = 1.0;
vertices[3].ty = 1.0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*4, &vertices[0].x, GL_STATIC_DRAW);
ushort indices[4];
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 3;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(ushort) * 4, indices, GL_STATIC_DRAW);
}
现在,我被卡在相机上。在我的项目的以前版本中,我使用glRotatef
和glTranslatef
来翻译和旋转场景,然后使用glBegin()
/glEnd()
模式呈现每个图块。但是现在这两个函数已经被弃用了,我没有找到任何有关在仅使用VBOs的上下文中创建摄像头的教程。哪一种是正确的方式?我是否应该根据新的摄像机位置在每个瓦片之间循环修改顶点的位置?
您是否正在使用固定功能管线?另外,在OpenGL中没有相机的概念。将每个顶点与模型 - 视图 - 投影矩阵(其中视图矩阵是您感兴趣的矩阵)相乘。您可以在顶点着色器中执行此操作(如果您使用固定功能管道,则还可以使用矩阵堆栈)。这个问题可能更适合http://gamedev.stackexchange.com/ – Samaursa
@Samaursa正如我所说,我没有使用固定功能的管道,因为从我读过的内容来看,它已经被弃用了。在我的渲染方法中,我基本上绑定了我的VBO并使用'glDrawElements()'方法来渲染它们。此外,'glPopMatrix()'和'glPushMatrix()'方法也被弃用,所以我不知道从哪里开始。 –
看到我的回答(更新了几个编辑 - 为此道歉,我忘了添加其中的一个部分) – Samaursa