Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用OpenGL/LibGDX的后处理问题-黑屏(FBO、着色器、四边形)_Android_Opengl Es_Libgdx_Fbo - Fatal编程技术网

Android 使用OpenGL/LibGDX的后处理问题-黑屏(FBO、着色器、四边形)

Android 使用OpenGL/LibGDX的后处理问题-黑屏(FBO、着色器、四边形),android,opengl-es,libgdx,fbo,Android,Opengl Es,Libgdx,Fbo,我在将后处理阶段渲染到屏幕时遇到一些问题。我编写了一些在屏幕上渲染OK的代码,然后决定需要一些后处理(乌贼色的bloom效果,但之后会出现),所以我决定将所有内容渲染到帧缓冲区对象,然后使用其颜色纹理渲染带纹理的全屏四边形。问题是,即使使用一些普通的着色器,在启用深度测试时,我也会得到一个禁用深度测试的黑屏(或清除颜色缓冲区所用的任何颜色),或者一些垃圾像素占据屏幕的左下四分之一(那只是盲目的测试,我不确定是否需要在2D游戏中进行深度测试,但我对OpenGL的理解很差) 那么,我做错了什么?下面

我在将后处理阶段渲染到屏幕时遇到一些问题。我编写了一些在屏幕上渲染OK的代码,然后决定需要一些后处理(乌贼色的bloom效果,但之后会出现),所以我决定将所有内容渲染到帧缓冲区对象,然后使用其颜色纹理渲染带纹理的全屏四边形。问题是,即使使用一些普通的着色器,在启用深度测试时,我也会得到一个禁用深度测试的黑屏(或清除颜色缓冲区所用的任何颜色),或者一些垃圾像素占据屏幕的左下四分之一(那只是盲目的测试,我不确定是否需要在2D游戏中进行深度测试,但我对OpenGL的理解很差)

那么,我做错了什么?下面是代码:

平凡顶点着色器:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

varying vec4 vColor;
varying vec2 vTexCoord;

void main() {
    vColor = a_color;
    vTexCoord = a_texCoord0;
    gl_Position = a_position;
}
平凡片段着色器:

#ifdef GL_ES
precision mediump float;
#endif

varying vec4 vColor;
varying vec2 vTexCoord;

uniform sampler2D u_texture;

void main() {
    vec4 texColor = texture2D(u_texture, vTexCoord);
    gl_FragColor = vColor.rgba * vec4(texColor.rgb, 1.0);
}
初始化:

FrambeBuffer fbo;
ShaderProgram focusShader;
Mesh focusQuad;

@Override
public void show() {

    camera1 = new OrthographicCamera();
    camera1.setToOrtho(false);
    camera1.zoom = 0.8f;
    viewport = new ExtendViewport(Globals.VIEWPORT_WIDTH, Globals.VIEWPORT_HEIGHT, camera1);
    batch = new SpriteBatch();
    moveCamera(camera1, player.getX(), player.getY());
    fbo = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
    ShaderProgram.pedantic = false;
    focusShader = new ShaderProgram(Gdx.files.internal("shaders/trivial_vshader"), Gdx.files.internal("shaders/trivial_fshader"));
    focusQuad = createFullScreenQuad(); //TAKEN FROM https://github.com/manuelbua/libgdx-contribs/blob/master/postprocessing/src/main/java/com/bitfire/postprocessing/utils/FullscreenQuad.java
    // Other game initialization...
}
渲染循环:

@Override
public void render(float delta) {
    // (UPDATE PHYSICS)...
    fbo.begin();
    {
    /* DRAW THE PLAYER */
        batch.setProjectionMatrix(camera1.combined);
        batch.begin();
        player.drawTrail(batch, delta);
        player.draw(batch, delta);
        batch.end();

        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        shapeRenderer.setProjectionMatrix(camera1.combined);
        shapeRenderer.begin(ShapeType.Filled);
        map.drawEffects(camera1, shapeRenderer);
        //(OTHER GAME STUFF AND EFFECTS...)
        shapeRenderer.end();
        Gdx.gl.glDisable(GL20.GL_BLEND);
    }
    fbo.end();

    //NOW THE PROBLEM
    Gdx.gl.glClearColor(0, 0.4f, 0.3f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    //Gdx.gl.glEnable(GL20.GL_DEPTH_TEST);
    Gdx.gl.glEnable(GL20.GL_BLEND);
    Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
    fbo.getColorBufferTexture().bind();
    focusShader.begin();
    focusShader.setUniformi("u_texture", 0);
    focusQuad.render(focusShader, GL20.GL_TRIANGLE_FAN, 0, 4);
    focusShader.end();
}

您是否尝试在fbo.end之前获取对颜色纹理的引用。我不确定fbo-end是否自动处理它。

是否检查了帧缓冲区中的内容?尝试在fbo.end()之前获取fbo颜色纹理。这可能会有帮助。如果其他一切都正常。谢谢你的回复。我认为FBO的内容是正确的,因为在我向FBO绘图之前,我是在屏幕上绘图的(它工作了),而且更重要的是,我可以使用
SpriteBatch
(无着色器)绘制FBO颜色纹理,我可以看到它有点正常(我没有尝试这么多,但我仍然在缩放或视口方面遇到问题-一切都太大了-但我可以看到游戏正在运行)。我查看了“createFullScreenQuad”代码,它会创建一个没有颜色属性的网格,但您使用的是顶点颜色。您是否修改了
createFullScreenQuad
以使用颜色属性?深度测试不应用于纯2D场景,除非您有不透明的精灵,您希望为您排序。此外,这是仅在桌面或Android上出现的问题?RGBA8888不支持移植到所有Android设备上。谢谢,Tenfour04。这就是重点。我没有修改它。我现在可以看到场景;但是它有一些意想不到的问题,因为如果不接触渲染循环内部的任何东西(原始循环,现在在
fbo.begin()
fbo.end()
之间),现在我看不到正在渲染的灯光(我使用的是Box2D灯光;现在一切都像我没有灯光时一样——一切都是明亮的、原始颜色——),并且颜色缓冲区没有被正确清除。我在家时会详细说明答案,请随意将其作为答案发布,以便我可以向上投票。鉴于我的最后一个答案,这不可能是真的。结束FBO只是将其与渲染目标AFAIK解除绑定,因此它不会处理它。此外,这是“垃圾”我可以看到,当启用深度测试时,它与我们应该看到的内容有关(当我的播放器应该移动时,它会改变或闪烁)。它一定是其他东西。