c++ - 使用着色器在 OpenGL 中绘制 spritesheet 的技术

标签 c++ opengl sprite-sheet

我现在正在学习 OpenGL,我想从 sprite 表中绘制一些 sprite 到屏幕上。不过,我很确定自己的做法是否正确。

我想做的是像 Terraria 一样用瓷砖 build 一个世界。这意味着构建我的世界的所有瓷砖都是 1x1,但我以后可能想要像 2x1、1x2、2x2 等的实体。

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

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

然后,当我绘制图 block 时,我只需绑定(bind)缓冲区并更新着色器的 UV 坐标和顶点位置。之后,我将图 block 的变换矩阵传递给着色器并使用 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 tiles 的缓冲区,一个用于 2x1 tiles 等的缓冲区等等,然后让 Tile 类包含 UVpos 和 UVsize 然后将它们发送到着色器,但我不确定我是怎么做的会那样做。

我认为我描述的 1x1 缓冲区和 2x1 缓冲区听起来会快很多。

最佳答案

Could I do this more efficiently?

我不认为你可以更少高效地完成它。您正在为每个四边形绑定(bind)一个完整的缓冲区对象。然后你上传一个矩阵。对于每个四边形。

tilemap 绘制(仅 map ,而不是实体)的正常工作方式是构建一个缓冲区对象,其中包含部分可见屏幕的图 block 。空白空间呈现为透明图 block 。然后,您可以在一个绘图调用中渲染该屏幕区域的所有 瓦片。您为该区域中的所有图 block 提供一个矩阵。

通常,您会有一定数量的此类可见区域,以便在区域发生变化时轻松更新该区域的图 block 。离开屏幕的区域会重新用于出现在屏幕上的区域,因此您可以用新的图 block 数据填充它们。

关于c++ - 使用着色器在 OpenGL 中绘制 spritesheet 的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426412/

相关文章:

c++ - 更改委托(delegate)中的 QComboBox 项目文本

c++ - 使用具有透视图的移动相机时如何避免像素化几何体?

c++ - 非二次方纹理给出 "This application has requested the Runtime..."错误

c++ - 如何在 openGL 中正确显示球体

java - 多个动画的动画偏移

c++ - 为什么不能将 Q_OBJECT 与模板类一起使用?

c++ - 等待某个网站被访问

css - 用作背景图像时如何缩放 CSS Sprite ?

c++ - 在没有物理连接的情况下写入时,boost async tcp 客户端不会返回错误

iOS:我可以使用已经用 Adob​​e Animate 创建的 Texture Atlas 吗?