- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个简单的迷宫游戏,而不使用任何已弃用的 OpenGL API(即没有即时模式)。我为迷宫中的每个图 block 使用一个顶点缓冲区对象,它本质上是四个 Vertex
的组合:
class Vertex {
public:
GLfloat x, y, z; // coords
GLfloat tx, ty; // texture coords
Vertex();
};
并像这样存储在 VBO 中:
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()
渲染每个图 block /glEnd()
模式。但是这两个函数现在已被弃用,而且我没有找到任何关于在仅使用 VBO 的上下文中创建相机的教程。哪种方法是正确的?我是否应该在每个图 block 之间循环,根据新的相机位置修改顶点的位置?
最佳答案
But these two functions are now deprecated, and I didn't find any tutorial about creating a camera in a context using only VBOs.
IBO 与此无关。
立即模式和矩阵堆叠是两双不同的鞋子。 VBO 处理将几何数据获取到渲染器,矩阵堆栈处理在那里获取转换。只有几何数据会受到 VBO 的影响。
至于你的问题:你自己计算矩阵,通过uniform传递给shader。同样重要的是要了解 OpenGL 的矩阵函数从未被 GPU 加速(除了一台机器,SGI 的 Onyx),所以这甚至没有提供一些性能增益。实际上,使用 OpenGL 的矩阵堆栈对整体性能有负面影响,因为执行了冗余操作,这些操作也必须在程序的其他地方完成。
对于简单的矩阵数学库,请查看我的 linmath.h
http://github.com/datenwolf/linmath.h
关于c++ - OpenGL 第一人称相机旋转和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963223/
我是一名优秀的程序员,十分优秀!