【发布时间】:2020-02-17 10:39:11
【问题描述】:
我实际尝试实现的目标: 我想用渐变垂直颜色绘制文本。我找到了this 解决方案,但它不太适合我,因为在我的情况下,渐变字体周围有黑色方块 - 不知道如何摆脱它,所以我开始简单(不相关的部分)问题以更好地理解 opengl 和 libgdx 中混合和帧缓冲区的物理原理
我试图理解的内容与我的目标无关: 我有一个带有白色方块的纹理,我将它绘制在红色背景之上。我正在尝试在白色方块上画一个绿色方块,绿色方块部分覆盖白色方块,部分位于红色背景之上(见下图)。
我的意图是:绿色方块后面的白色区域应该涂成绿色,但所有红色背景不应该受到影响并保持不变(红色)。
我该怎么做?
package com.mygdx.game;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
public class Game extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
private int height;
private int width;
private ShapeRenderer shapeRenderer;
@Override
public void create() {
batch = new SpriteBatch();
img = new Texture("white.png");
width = Gdx.graphics.getWidth();
height = Gdx.graphics.getHeight();
shapeRenderer = new ShapeRenderer();
shapeRenderer.setAutoShapeType(true);
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, width / 7, height / 4);
batch.end();
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_SRC_COLOR);
shapeRenderer.begin();
shapeRenderer.set(ShapeRenderer.ShapeType.Filled);
shapeRenderer.setColor(Color.GREEN);
shapeRenderer.rect(width / 2 - 100, height / 4 - 50, 200, 200);
shapeRenderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
}
@Override
public void dispose() {
batch.dispose();
img.dispose();
}
}
理想情况下,绿色方块无论如何都不应该是透明的,只是应该在它隐藏白色区域的地方阻挡白色。
更新: 我将@Xoppa 的答案标记为正确,因为它通过以下结果解决了我原来的问题:
【问题讨论】:
-
您不能使用颜色信息来引导混合。缓冲区中像素的唯一区别在于 G 和 B 通道,白色方块为 1,背景为 0,但这不是您可以直接用于混合的东西。更好的方法是将绿色矩形绘制到 stencil 缓冲区,然后然后 渲染白色方块。
-
最好更新您的示例/问题,以便其他人可以看到您真正需要的内容
-
是的,已更新,谢谢
-
您能否针对更新的用例发布一个包含更多详细信息的新问题。 (例如:字体细节、渐变颜色/方向/等)正如其他人所说,您很可能会为此提供着色器,我可能会为您提供帮助。
-
你说得对@Nicolas,我应该用直接用例发布一个新问题