【问题标题】:Why am I getting a blank screen when using shader?为什么使用着色器时出现空白屏幕?
【发布时间】:2015-08-01 20:56:07
【问题描述】:

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

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

我的代码:

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

有什么想法吗?

【问题讨论】:

  • 您的着色器与教程中显示的完全一样吗?
  • @Tenfour04 是的。我刚刚在两者上都运行了diff 以再次确认。
  • 尝试用 sprite.draw(batch);我认为您正在使用修改精灵的原点和 UV 的批处理方法。
  • 我试过了,但没有帮助:(

标签: libgdx glsl shader


【解决方案1】:

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

顺便说一下,你需要在resize中更新你的相机的宽高,这样视图才不会失真。

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

【讨论】:

  • 是的,就是这样。我将图像更改为PNG 并得到了轮廓。但现在我看到,虽然轮廓按预期绘制,但精灵的内部没有绘制。例如,绿色填充的圆圈用蓝色轮廓勾勒出轮廓,但用红色(“空白颜色”)而不是绿色填充。但我想,这是一个单独的问题。谢谢!
  • 我从教程中的理解是,当您想要突出显示它时,您打算使用此着色器再次绘制精灵。这样,您可以在一批中正常绘制所有场景,然后在第二批中绘制突出显示的内容。可以编写一个着色器一次性完成所有操作,但它会中断批处理,以便为您应用它的一个精灵来回切换着色器。除非你有一堆散布在你的舞台上,否则没什么大不了的。
  • 这是有道理的。谢谢你真的帮了很多忙。
猜你喜欢
  • 2012-04-26
  • 2018-08-25
  • 2021-05-17
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2022-06-26
相关资源
最近更新 更多