为什么在使用着色器时出现空白屏幕?
Why am I getting a blank screen when using shader?
我正在使用这个 tutorial 为我的游戏 Sprite
创建和绘制轮廓。但是,我得到的只是一个空白的红色屏幕。我是 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 通道,因此没有边框可以用来绘制任何东西。
顺便说一下,您需要在 resize
中更新相机的宽度和高度,这样视图才不会失真。
教程中的片段着色器可以使用一些优化。它有多个依赖纹理读取和多个 if
语句。 if
语句应替换为对 clamp
的调用。除非精灵有一些超薄区域,否则可能不需要对附近像素进行详尽搜索来检测边缘。
我正在使用这个 tutorial 为我的游戏 Sprite
创建和绘制轮廓。但是,我得到的只是一个空白的红色屏幕。我是 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 通道,因此没有边框可以用来绘制任何东西。
顺便说一下,您需要在 resize
中更新相机的宽度和高度,这样视图才不会失真。
教程中的片段着色器可以使用一些优化。它有多个依赖纹理读取和多个 if
语句。 if
语句应替换为对 clamp
的调用。除非精灵有一些超薄区域,否则可能不需要对附近像素进行详尽搜索来检测边缘。