0
  1. 假设我有一个面向右侧的角色,我需要镜像图像,以便他现在面向左侧。我该怎么做呢?我在 中找到了翻转方法gl::Texture,但它是垂直翻转的,而不是水平翻转的。

  2. 我注意到,如果我在该draw()方法期间不清除整个窗口,那么我在最后一帧绘制的任何内容仍然存在。这很好,因为我只想更新哪些更改,但是如何gl::Texture从当前帧中删除特定的?

4

2 回答 2

1

1:绘制在X轴上翻转的纹理

有很多方法可以达到这种效果。哪一个最适合您取决于您​​如何绘制纹理。由于您从 Cinder 开始,我猜您正在使用 ci::gl::draw 函数并将其传递给 TextureRef 对象。在这种情况下,绘制翻转纹理的一种简单方法是(您可以将其放在绘制纹理的任何位置):

// This is to get a "fresh" coordinate system for drawing and to make sure
// you can clean up after you're done
ci::gl::pushMatrices();

// Move the coordinate system to where you want to draw the texture
ci::gl::translate(ci::Vec2f(100, 100));

// Scaling the coordinate system by -1 effectively flips that axis
// (e.g. whatever was going to be drawn at x: 10 will now be drawn at x: -10)
ci::gl::scale(ci::Vec3f(-1, 1, 1));

// Draw your texture
ci::gl::draw(texture);

// Clean up after yourself so any drawing calls after this don't use your modified
// coordinates
ci::gl::popMatrices();

2:从框架中删除纹理

没有真正简单的方法可以完成您所描述的事情(即绘制到帧缓冲区,然后删除与特定纹理关联的所有像素)。但是,根据您要达到的效果,可能有一些方法可以做您想做的事情,但它们都相对先进。例如,您可以将要删除的纹理绘制到“纹理”缓冲区,并将其他所有内容绘制到“背景”缓冲区。您将绘制背景缓冲区的每一帧,然后在其顶部绘制纹理缓冲区。当您想“删除”纹理缓冲区时,您只需停止绘制它。

PS - 我很高兴更详细地介绍如何绘制多个缓冲区(实际上 Cinder 使它相对容易),但前提是您认为这是一个兔子洞;)

于 2014-09-09T21:34:43.637 回答
0

好的,所以我不熟悉 Cinder 库,无法告诉你是否有水平翻转图像的方法。但是,出于您在第 1 项中举例说明的目的,您可能不想翻转图像本身。Cinder 的 Texture 中的翻转方法实际上会翻转图像像素,创建一个新的纹理。当你想让你的角色面对它的一面时,这是一种昂贵的调用方式。相反,您应该做的只是对精灵应用旋转变换。我相信您可以从库示例和文档中了解到,它看起来非常完整。

至于第 2 项,请记住,运行库的底层图形驱动程序将使用双缓冲进行渲染并不断刷新屏幕,因此当您在一个缓冲区中绘制时,另一个正在显示。这避免向用户显示部分绘制的图像。但是,图形驱动程序不会自行擦除正在处理的缓冲区,您必须明确命令它以将屏幕清除为某种颜色。如果你不这样做,上次抽奖的剩菜仍然会在那里。因此,在 every 开始时清除屏幕draw()、渲染精灵然后交换缓冲区以呈现绘图是正常的。例如,这使得平滑动画成为可能,因为这个过程每秒会发生 30 到 60 次。

于 2014-08-03T01:59:49.283 回答