如何在 Open GL 中创建连续重复滚动的背景图像?

nul*_*ull 5 android opengl-es graphic

我有一张图片:background.png。如何使用 android OpenGL ES 或 AndEngine 库或您知道的其他技术创建连续重复滚动的背景图像?

例子:
移动云

目前,我使用两个相邻图像技术。我加载图像(background.png)两次并将它们相邻放置,然后移动它们。所以它看起来就像是一张连续滚动的图像。

但是,不知何故,我认为仅使用一个图像实例可能会有更好的解决方案。有谁可以分享一下吗?

更新
对于好奇的人来说,这是两个相邻图像的代码(使用 AndEngine 库):

movingBackgroundSprite.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, -CAMERA_HEIGHT, 0)));     
movingBackgroundSprite2.registerEntityModifier(new LoopEntityModifier(
    new MoveYModifier(10, 0, CAMERA_HEIGHT)));
Run Code Online (Sandbox Code Playgroud)

上面的代码是关于重复制作背景图像并从上到下垂直滚动。

注意:
* movingBackgroundSprite 是加载background.png 图像的Sprite 类。您可以看到背景精灵有两个实例。
* registerEntityModifier -> 为 Sprite 应用修改器/行为
* LoopEntityModifier -> 循环行为
* MoveYModifier -> 按 y 位置移动行为。第一个参数是持续时间(您可以忽略它,因为它与问题无关),第二个参数是源 Y 位置,第三个参数是目标 Y 位置。
* CAMERA_HEIGHT -> 定义背景图像高度的常量。

Dam*_*mon 5

如果你已经设置了glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)(我认为这是默认设置),你可以只绘制一个全屏四边形并s以小步增量增加纹理坐标(如果你想要的话,它也可以垂直工作)。

大于 1.0 的值将环绕到纹理的左侧,无需额外操作。而且,不需要两次绘制调用。

你没有说你有 ES 1.0 还是 2.0,但如果是 2.0,你可以将偏移量作为统一传递,并将其添加到着色器中的纹理坐标,这比每次更改顶点数据(texcoord)更有效框架。尽管是每帧一次,但它可能并不重要,它可能只是相同的。

编辑:
我不知道 AndEngine,可能有更简单、更方便的命令来绘制纹理全屏四边形...但给定“OpenGL ES 1.0”,使用立即模式并假设默认 MVP 矩阵,这可能看起来像这样举一个非常粗略的例子:

glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);
glTexImage(...);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
...
float offset = 0.0f;
while(!quit)
{
    offset += 1.0f/texture_size;

    glBindTexture(GL_TEXTURE_2D, cloudy_sky_texture);

    glBegin(GL_QUADS);
        glVertex2f(-1.0f, -1.0f);
        glTexCoord2f(0.0f + offset, 0.0f);
        ...
        glVertex2f(1.0f,  1.0);
        glTexCoord2f(1.0f + offset, 1.0f);
    glEnd();

    DrawForegroundStuff();
}
Run Code Online (Sandbox Code Playgroud)

为了简洁省略了一些行,立即模式不太好,还有很大的优化空间,但原理应该很清楚。您实际上只需绘制一个四边形并增加s纹理坐标的分量即可。