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.