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

时间:2015-08-01 20:56:08

标签: libgdx glsl shader

我正在使用此tutorial为我的游戏Sprite创建并绘制轮廓。但是,我得到的只是一个空白的红色屏幕。我对Shader很新,所以我不确定我是否遗漏了一些非常微不足道的东西。我的顶点和片段着色器是从上面的教程中复制粘贴的。

(评论教程似乎没有用,所以我无法在那里寻求帮助。)

我的代码:

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);
}

任何想法?

1 个答案:

答案 0 :(得分:2)

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

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

教程中的片段着色器可以使用一些优化。它具有多个依赖纹理读取和多个if语句。 if语句应替换为clamp的调用。除非精灵具有一些超薄区域,否则可能无需对邻近像素进行穷举搜索,除非精灵具有一些超薄区域。