简体   繁体   中英

libgdx - error while trying to use ShapeRenderer

I'm trying to make a fade in effect using ShapeRenderer with this code:

            Gdx.gl.glEnable(GL20.GL_BLEND);
            Gdx.gl20.glBlendFunc(GL20.GL_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
            //ShaderProgram.pedantic = false;

            shapeRenderer.setProjectionMatrix(stage.getCamera().combined);
            shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
            shapeRenderer.setColor(new Color(0,0,0,fadeTimeElapsed/1.5f));
            shapeRenderer.rect(0,0,Gdx.graphics.getWidth(),Gdx.graphics.getHeight());
            shapeRenderer.end();

            Gdx.gl20.glDisable(GL20.GL_BLEND);

I get the following exception:

FATAL EXCEPTION: GLThread 2715 java.lang.IllegalArgumentException: no uniform with name 'u_projModelView' in shader at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:287) at com.badlogic.gdx.graphics.glutils.ShaderProgram.fetchUniformLocation(ShaderProgram.java:277) at com.badlogic.gdx.graphics.glutils.ShaderProgram.setUniformMatrix(ShaderProgram.java:507) at com.badlogic.gdx.graphics.glutils.ShaderProgram.setUniformMatrix(ShaderProgram.java:498) at com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20.flush(ImmediateModeRenderer20.java:147) at com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20.end(ImmediateModeRenderer20.java:160) at com.badlogic.gdx.graphics.glutils.ShapeRenderer.end(ShapeRenderer.java:1104) at net.ukk.rpg.Level.render(Level.java:93) at com.badlogic.gdx.Game.render(Game.java:46) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:422) at android.opengl.GLSurfaceView$GLThread.guarded Run(GLSurfaceView.java:1542) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1266)

BTW with ShaderProgram.pedantic=false , I don't get any filled rectangle. Thanks in advance.

The problem was that I was instantiating the ShapeRenderer in a Thread. Calling the constructor in the show() method solved the issue.

I had the same crash when I called my method (showAxesTicks) on UI thread that eventually called shapeRenderer.end(). I resolved it by embracing showAxesTicks() inside Gdx.app.postRunnable(new Runnable() ...) as @user1702985 mentioned. I think it causes the functions to get ran on the same OpenGL thread:

------------BEFORE CHANGE----------------

public void onGridMarkersMetricSelected() {
    mLibgdxFragment.showAxesTicks(true);

    hDebugConsole.consoleLog(TAG, "User enabled Metric Grid Markers");
    return;
}

------------AFTER CHANGE----------------

public void onGridMarkersMetricSelected() {
    Gdx.app.postRunnable(new Runnable() {
        @Override
        public void run() {
            mLibgdxFragment.showAxesTicks(true);                
        }
    });
    hDebugConsole.consoleLog(TAG, "User enabled Metric Grid Markers");
    return;
} 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM