【发布时间】:2014-07-11 09:52:10
【问题描述】:
我认为 OpenGL(我使用的是 OpenGL 4.0)支持顶点缓冲区对象,这是(如果我错了,请纠正我)一种绘制顶点的动态方式,当您可以释放动态数组时,将它们绑定类似于纹理绑定将其绑定到纹理后的像素数,即使数组中的像素数据丢失,您仍然可以绘制它。 我试图制作一个迷你Minecraft游戏,但在绘制了256x256x60的世界(256宽高和60块深度)之后,游戏完全卡住了。我尝试只绘制 256x256x6,但它仍然不如 Minecraft 运行那么快。 我通过以下方式绘制了一个块:
void DrawBlock(double x, double y, double z, float xx, float yy, float zz)
{
// Render a color-cube consisting of 6 quads with different colors
xx = xx / 2;
yy = yy / 2;
zz = zz / 2;
x -= xx;
y -= yy;
z -= zz;
glBegin(GL_QUADS); // Begin drawing the color cube with 6 quads
// Top face (y = z + zz)
// Define vertices in counter-clockwise (CCW) order with normal pointing out
glColor3f(0.0f, 1.0f, 0.0f); // Green
glVertex3f(x + xx, y + yy, z - zz);
glVertex3f(x - xx, y + yy, z - zz);
glVertex3f(x - xx, y + yy, z + zz);
glVertex3f(x + xx, y + yy, z + zz);
// Bottom face (y = z - zz)
glColor3f(1.0f, 0.5f, 0.0f); // Orange
glVertex3f(x + xx, y - yy, z + zz);
glVertex3f(x - xx, y - yy, z + zz);
glVertex3f(x - xx, y - yy, z - zz);
glVertex3f(x + xx, y - yy, z - zz);
// Front face (z = z + zz)
glColor3f(1.0f, 0.0f, 0.0f); // Red
glVertex3f(x + xx, y + yy, z + zz);
glVertex3f(x - xx, y + yy, z + zz);
glVertex3f(x - xx, y - yy, z + zz);
glVertex3f(x + xx, y - yy, z + zz);
// Back face (z = z - zz)
glColor3f(1.0f, 1.0f, 0.0f); // Yellow
glVertex3f(x + xx, y - yy, z - zz);
glVertex3f(x - xx, y - yy, z - zz);
glVertex3f(x - xx, y + yy, z - zz);
glVertex3f(x + xx, y + yy, z - zz);
// Left face (x = z - zz)
glColor3f(0.0f, 0.0f, 1.0f); // Blue
glVertex3f(x - xx, y + yy, z + zz);
glVertex3f(x - xx, y + yy, z - zz);
glVertex3f(x - xx, y - yy, z - zz);
glVertex3f(x - xx, y - yy, z + zz);
// Right face (x = z + zz)
glColor3f(1.0f, 0.0f, 1.0f); // Magenta
glVertex3f(x + xx, y + yy, z - zz);
glVertex3f(x + xx, y + yy, z + zz);
glVertex3f(x + xx, y - yy, z + zz);
glVertex3f(x + xx, y - yy, z - zz);
glEnd(); // End of drawing color-cube
}
当 x、y 和 z 数据位于称为“块”的结构数组中时。
我除了画什么都没做,只是因为画一直卡住,
显示函数在每次运行时总是调用DrawBlock() 256x256x6 或 256x256x60 次。
如何使用 VBO 动态执行此操作?
我查看了互联网,但出现了一些未定义的函数,例如 glGenBuffersARB() 等等。
一个简单立方体的任何示例代码?
【问题讨论】:
-
看这个问题OpenGL: VBO or glBegin() + glEnd()?。在开始这样的大型项目之前,您真的应该学习 OpenGL 的基本知识。此外,您应该阅读有关体素引擎的信息,因为即使使用 VBO,如果您尝试渲染所有块,也会遇到问题。
-
@t.niese 现在它只是在块之间移动:P
-
我认为是这样,但这(以快速方式管理和渲染块)是基于块的游戏中的复杂部分之一。 ;) 添加碰撞检测(在方块上行走会更加复杂)。
-
@t.niese 块之间的碰撞检测 - 3 维?不,到目前为止,一切都在少量工作。而且我对如何与 NO 循环发生冲突有一个想法,大约 2-3 个 if 语句:P 无论如何,你有任何使用 VBO 的示例代码吗?
-
您是否曾经费心按照我的第一条评论中的链接阅读问题及其答案(或在网络上搜索 VBO 教程)?无论如何,我试图给你一个很好的建议,让你首先学习现代 OpenGL (3.2+) 的基础知识,而不仅仅是如何使用 VBO 和寻找体素引擎。