Cinder& C ++:镜像纹理和高效的绘图问题

时间:2014-08-02 18:52:20

标签: c++ opengl cinder

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

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

2 个答案:

答案 0 :(得分: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:从帧中删除纹理

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

P.S。 - 我很高兴能够详细介绍如何绘制多个缓冲区(实际上Cinder使它相对容易),但只有当你认为这是一个兔子洞,你才想要潜水;)

答案 1 :(得分:0)

好的,所以我不熟悉Cinder库,以便能够告诉您是否有水平翻转图像的方法。但是,为了您在第1项中举例说明的目的,您可能不想翻转图像本身。 Cinder纹理中的翻转方法实际上会翻转图像像素,从而创建新的纹理。当你想让你的角色面对它时,这是一种昂贵的方式。相反,你应该做的只是将旋转变换应用于精灵。我确定你可以从图书馆examples and documentation了解到这一点,看起来非常完整。

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