影响整个屏幕的Libgdx着色器

时间:2017-12-29 22:28:19

标签: opengl libgdx shader

我正在Libgdx制作游戏。

我所知道如何使用着色器的唯一方法是让批处理一个接一个地影响给定的纹理。这就是我通常在我的代码中所做的事情:

shader = new ShaderProgram(Gdx.files.internal("shaders/shader.vert"), Gdx.files.internal("shaders/shader.frag"));
batch.setShader(shader);

这就是所有需要的代码。

无论如何,我不想在纹理之间进行这种分离。但是,我找不到任何方法用着色器立刻影响整个屏幕,就像整个屏幕只是一个大的纹理。对我来说,这似乎是使用着色器最合理的方式。

那么,有没有人知道如何做这样的事情?

2 个答案:

答案 0 :(得分:0)

使用相同的批次绘制所有纹理(玩家,演员,风景......),如果您想要使用相同着色器影响背景,请在背景中绘制一个具有屏幕大小的静态纹理,用相同的批次绘制它。

答案 1 :(得分:0)

使用FBO对象非常容易,您可以像在问题中所说的那样获得“整个屏幕就像一个大纹理”:

首先,在进行任何渲染之前,创建FBO对象并开始:

FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, Width, Height, false);
fbo.begin();

然后完成所有常规渲染:

Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
...
Batch b = new SpriteBatach(...
//Whatever rendering code  you have

最后将FBO保存到纹理或精灵中,对其进行所需的任何转换,并在其上准备和使用着色器。

fbo.end();
SpriteBatch b = new SpriteBatch();
Sprite s = new Sprite(fbo.getColorBufferTexture());
s.flip(false,true); //Coord systems in buffer differs from screen

b.setShader(your_shader);
b.begin();

your_shader.setUniformMatrix("u_projTrans",camera.combined); //if you have camera
viewport.apply(); //if you have viewport
b.draw(s,0,0,viewportWidth,viewportHeight);  

b.end();
b.setShader(null);

这就是全部!

基本上,您要做的是将所有资产,游戏场景和场景“渲染”到缓冲区中,然后将缓冲区图像保存到纹理中,最后用所需的着色器效果渲染该纹理。

您可能会注意到,由于要将所有屏幕复制到缓冲区,因此效率非常低。另外请注意,某些较旧的驱动程序仅支持FBO的2种大小的功率,因此您可能需要牢记这一点,请查看here以获取有关该主题的更多信息。