【问题标题】:Techniques for drawing spritesheets in OpenGL with shaders使用着色器在 OpenGL 中绘制精灵表的技术
【发布时间】:2013-01-03 18:51:49
【问题描述】:

我现在正在学习 OpenGL,我想从精灵表中将一些精灵绘制到屏幕上。我注意到我这样做是否正确。

我想做的是用泰拉瑞亚的瓷砖建造一个世界。这意味着构建我的世界的所有图块都是 1x1,但我以后可能想要 2x1、1x2、2x2 等实体。

我现在要做的是,我有一个名为“Tile”的类,其中包含 tile 的变换矩阵和指向其缓冲区的指针。很简单:

Tile::Tile(glm::vec2 position, GLuint* vbo)
{
    transformMatrix = glm::translate(transformMatrix, glm::vec3(position, 0.0f));
    buffer = vbo;
}

然后,当我绘制图块时,我只需绑定缓冲区并更新着色器的 UV 坐标和顶点位置。之后,我将图块的变换矩阵传递给着色器并使用 glDrawElements 绘制它:

glEnableVertexAttribArray(positionAttrib);
glEnableVertexAttribArray(textureAttrib);

for(int i = 0; i < 5; i++) 
{
    glBindBuffer(GL_ARRAY_BUFFER, *tiles[i].buffer);

    glVertexAttribPointer(positionAttrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), 0);
    glVertexAttribPointer(textureAttrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)(2 * sizeof(GLfloat)));

    glUniformMatrix4fv(transformMatrixLoc, 1, GL_FALSE, value_ptr(tiles[i].transformMatrix));
    glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0);
}

glDisableVertexAttribArray(positionAttrib);
glDisableVertexAttribArray(textureAttrib);

我能更有效地做到这一点吗?我在想我可以有一个用于 1x1 瓦片的缓冲区,一个用于 2x1 瓦片等的缓冲区,然后让 Tile 类包含 UVpos 和 UVsize,然后将它们发送到着色器,但我不确定我是如何会这样做的。

我认为我用一个用于 1x1 的缓冲区和一个用于 2x1 的缓冲区所描述的内容听起来会快很多。

【问题讨论】:

  • 使用精灵表作为贴图的纹理并指定要使用的表部分听起来是个不错的方法。不幸的是,我没有使用过 GLSL(只有 Cg 和 HLSL),所以我对 how 无能为力。您是否尝试过搜索有关如何设置着色器参数的示例?
  • 我知道如何在着色器中设置值,它由 glDrawElements 上面的三行完成。问题是我需要将 4 个 uv-coord 对传递给着色器,因为它是基于每个顶点完成的。我不知道如何绑定缓冲区然后发送 uv 数据

标签: c++ opengl sprite-sheet


【解决方案1】:

我能更有效地做到这一点吗?

我认为你不能有效地做到这一点。您正在为每个四边形绑定整个缓冲区对象。然后,您正在上传一个矩阵。对于每个四边形。

平铺地图的绘制方式(只有地图,而不是实体)通常的工作方式是构建一个缓冲区对象,其中包含可见屏幕平铺的某些部分。空白空间呈现为透明瓷砖。然后,您可以在一次绘图调用中渲染屏幕该区域的所有图块。您为该区域中的所有图块提供一个矩阵。

通常,您会有一些这样的可见区域,以便在该区域更改时轻松更新该区域的图块。屏幕外的区域被重新用于屏幕上的区域,因此您可以用新的图块数据填充它们。

【讨论】:

  • 这就是我问的原因.. 我已经阅读了一堆教程,但我发现没有一个不使用 glBegin 的教程只画一张脸。我没有想到我可以将更多的东西绑定到一个缓冲区中。谢谢
猜你喜欢
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多