Libgdx 为什么使用着色器时会出现空白屏幕?

Libgdx 为什么使用着色器时会出现空白屏幕?,libgdx,glsl,shader,Libgdx,Glsl,Shader,我用它为我的游戏Sprites创建并绘制一个轮廓。然而,我得到的只是一个空白的红色屏幕。我对Shaders非常陌生,所以我不确定是否遗漏了一些非常琐碎的东西。我的顶点和片段着色器是从上述教程复制粘贴的 (评论教程似乎不起作用,因此我无法在那里寻求帮助。) 我的代码: float x = 0, y = 0, height = 256, width = 256, angle = 0, outlineSize = 1f; @Override public void create() { ba

我用它为我的游戏
Sprite
s创建并绘制一个轮廓。然而,我得到的只是一个空白的红色屏幕。我对
Shader
s非常陌生,所以我不确定是否遗漏了一些非常琐碎的东西。我的顶点和片段着色器是从上述教程复制粘贴的

(评论教程似乎不起作用,因此我无法在那里寻求帮助。)

我的代码:

float x = 0, y = 0, height = 256, width = 256, angle = 0, outlineSize = 1f;

@Override
public void create() {
    batch = new SpriteBatch();
    img =new Texture("badlogic.jpg");
    sprite = new Sprite(img);
    loadShader();
    float w = Gdx.graphics.getWidth(); // 640
    float h = Gdx.graphics.getHeight(); // 480
    cam = new OrthographicCamera(h, w);
    cam.update();
}

public void loadShader() {
    String vertexShader;
    String fragmentShader;
    vertexShader = Gdx.files.internal("shaders/outline.vsh").readString();
    fragmentShader = Gdx.files.internal("shaders/outline.fsh").readString();
    shaderOutline = new ShaderProgram(vertexShader, fragmentShader);
    if (!shaderOutline.isCompiled())
        throw new GdxRuntimeException("Couldn't compile shader: "
                + shaderOutline.getLog());
}

@Override
public void render() {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.setProjectionMatrix(cam.combined);
    cam.update();
    shaderOutline.begin();
    shaderOutline.setUniformf("u_viewportInverse", new Vector2(1f / width, 1f / height));
    shaderOutline.setUniformf("u_offset", outlineSize);
    shaderOutline.setUniformf("u_step", Math.min(1f, width / 70f));
    shaderOutline.setUniformf("u_color", new Vector3(0, 0, 1f));
    shaderOutline.end();
    batch.begin();
    batch.setShader(shaderOutline);
    batch.draw(sprite, x, y, width, height, width, height, 1f, 1f, angle);
    batch.end();
    batch.setShader(null);
}

有什么想法吗?

问题是您使用的图像“badlogic.jpg”没有alpha通道。该着色器沿高alpha和零alpha之间的边界在精灵边界内绘制轮廓。JPG文件没有alpha通道,因此没有可以绘制任何内容的边框

顺便说一下,您需要在调整大小中更新相机的宽度和高度,这样视图就不会失真


教程中的片段着色器可以使用一些优化。它具有多个相关纹理读取和多个
if
语句
if
语句应替换为调用
clamp
。除非精灵有一些超薄区域,否则可能不需要对附近像素进行彻底搜索来检测边缘。

您的着色器是否完全如该教程所示?@Tenfour04 yes。我只是在两者上运行了
diff
,以再次确认。尝试用sprite.draw(batch)替换batch.draw line;我认为您正在使用一种批处理方法来修改精灵的原点和UV。我尝试了这种方法,但没有任何帮助:(是的,就是这样。我将图像更改为
PNG
并获得了轮廓。但现在我看到,虽然轮廓是按预期绘制的,但精灵的内部没有绘制。例如,一个绿色填充的圆圈,轮廓是蓝色的,但填充了红色(“空白颜色”)而不是绿色。但我想这是一个单独的问题。谢谢!我从教程中了解到,当你想要高亮显示精灵时,你打算使用该着色器再次绘制精灵。这样你可以在一批中正常绘制所有场景,然后在第二批中绘制高亮显示的内容。可以编写着色器一次完成所有操作,但如果要为应用此操作的一个精灵来回切换着色器,则会中断批处理。除非在整个舞台上散布大量着色器,否则这不是什么大问题。这是有道理的。谢谢你帮了大忙。