【发布时间】:2016-05-20 12:34:52
【问题描述】:
我有一个自定义 ImageTextButton,我首先将按钮渲染到 FrameBuffer,然后使用 frameBuffer.getColorBufferTexture() 进行绘制。我真的不想这样做,但我使用带有此按钮的自定义着色器来创建一些视觉效果,而我能够实现它的唯一方法是使用 FrameBuffer。我惊讶地发现这实际上工作得非常顺利和快速,整个过程在慢速设备上需要 1-2 毫秒,并且有几个实例不会导致任何形式的帧率下降,所以我对这一点很满意。
我遇到的问题是当我在 ImageTextButton 上启用剪辑时(使用 setClip(true))。这样做的原因是按钮可以改变宽度,我希望它可以在按钮范围内剪辑文本。如果我禁用 FrameBuffer 并正常渲染,这部分也可以很好地工作。如果我将 2 结合起来,似乎剪辑过程会变得混乱,结果要么没有文本,要么文本的一小部分。
所以这里是相关的代码。我认为这是因为我设置 FrameBuffer 和 SpriteBatch 大小/投影矩阵只是为了处理活动区域(为了提高效率)但是如果我不修改任何这些并使用相同的批处理/投影矩阵,那么 FrameBuffer 管理整个屏幕,还是一样的结果。
public void initFrameBuffer(){
xCache = (int) super.getX(); yCache = (int) super.getY();
widthCache = (int) super.getWidth(); heightCache = (int) super.getHeight();
frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, widthCache, heightCache, false);
fboProjectionMatrix.setToOrtho2D(xCache, yCache+heightCache, widthCache, -heightCache);
this.fbBatch = new SpriteBatch();
this.fbBatch.setProjectionMatrix(fboProjectionMatrix);
this.frameBufferReady = true;
}
public void doFrameBuffer(Batch batch, float parentAlpha){
batch.end();
frameBuffer.begin();
fbBatch.begin();
Gdx.gl20.glClearColor(0f, 0.0f, 0.0f, 0.0f);
Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.draw(fbBatch, parentAlpha);
fbBatch.end();
frameBuffer.end();
batch.begin();
}
public void drawFrameBufferObject(Batch batch, float parentAlpha){
batchColorCache = batch.getColor();
batch.setColor(1.0f, 1.0f, 1.0f, parentAlpha);
batch.draw(frameBuffer.getColorBufferTexture(), getX(), getY());
batch.setColor(batchColorCache);
}
@Override
public void draw(Batch batch, float parentAlpha) {
if (!this.frameBufferReady) initFrameBuffer();
doFrameBuffer(batch, parentAlpha);
drawFrameBufferObject(batch, parentAlpha);
}
抱歉,代码太长了,它实际上已经为必要的部分进行了大量修剪。 一如既往地非常感谢您的帮助!
【问题讨论】: