Hi, I just don’t get why the blue triangle is rendered, I think that Blend isn’t enabled but I don’t know what I could do to fix it.
You can just compile and test it on your own if you want to, the code is “working”, the shaders not :
What I got:
-a blue triangle
What I expected:
-a red triangle, because the opacity from the blue one is 0
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.VertexAttribute;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
public class ErrorShader implements ApplicationListener {
MeshHelper meshHelper;
public static void main(String[] args) {
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.title = "Error";
cfg.useGL20 = true;
cfg.width = 500;
cfg.height = 500;
cfg.resizable = false;
new LwjglApplication(new ErrorShader(), cfg);
}
@Override
public void create() {
meshHelper = new MeshHelper();
meshHelper.createMesh(new float[] { -1.0f, -1.0f, Color.toFloatBits(0, 0, 255, 0),
0.0f, 1f, Color.toFloatBits(0, 0, 255, 0),
1f, -1.0f, Color.toFloatBits(0, 0, 255, 0) });
}
@Override
public void resize(int width, int height) {
}
@Override
public void render() {
Gdx.graphics.getGL20().glClearColor(0.2f, 0.2f, 0.2f, 1);
Gdx.graphics.getGL20().glClear(GL10.GL_COLOR_BUFFER_BIT);
Gdx.graphics.getGL20().glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL10.GL_ONE_MINUS_SRC_ALPHA, GL10.GL_SRC_ALPHA);
meshHelper.drawMesh();
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
meshHelper.dispose();
}
}
class MeshHelper {
private Mesh mesh;
private ShaderProgram redShader;
private ShaderProgram blueShader;
public MeshHelper() {
createShader();
}
public void createMesh(float[] vertices) {
mesh = new Mesh(true, vertices.length, 0,
new VertexAttribute(Usage.Position, 2, "a_position"),
new VertexAttribute(Usage.ColorPacked, 4, "a_color"));
mesh.setVertices(vertices);
}
public void drawMesh() {
if (mesh == null)
throw new IllegalStateException("drawMesh called before a mesh has been created.");
redShader.begin();
mesh.render(redShader, GL20.GL_TRIANGLES);
redShader.end();
blueShader.begin();
mesh.render(blueShader, GL20.GL_TRIANGLES);
blueShader.end();
}
private void createShader() {
String vertexShader = "attribute vec4 a_position; \n"
+ "attribute vec4 a_color; \n"
+ "varying vec4 v_color; \n"
+ "void main() \n"
+ "{ \n"
+ " v_color = a_color; \n"
+ " gl_Position = a_position; \n"
+ "} \n";
String fragmentBLUEShader =
//GL ES specific stuff
"#ifdef GL_ES\n" //
+ "#define LOWP lowp\n" //
+ "precision mediump float;\n" //
+ "#else\n" //
+ "#define LOWP \n" //
+ "#endif\n" + //
"\n" +
"void main() {\n" +
" gl_FragColor = vec4(0.0,0.0,1.0, 0.0);\n" + //Why is that rendered?
"}";
blueShader = new ShaderProgram(vertexShader, fragmentBLUEShader);
if (blueShader.isCompiled() == false)
throw new IllegalStateException(blueShader.getLog());
String fragmentREDShader =
//GL ES specific stuff
"#ifdef GL_ES\n" //
+ "#define LOWP lowp\n" //
+ "precision mediump float;\n" //
+ "#else\n" //
+ "#define LOWP \n" //
+ "#endif\n" + //
"\n" +
"void main() {\n" +
" gl_FragColor = vec4(1,0,0,1);\n" +
"}";
redShader = new ShaderProgram(vertexShader, fragmentREDShader);
if (redShader.isCompiled() == false)
throw new IllegalStateException(redShader.getLog());
}
public void dispose() {
mesh.dispose();
blueShader.dispose();
redShader.dispose();
}
}
edit:
Got it, if I use
Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
it works,
but I don’t understand why the other one doesn’t work. It would be great if someone could explain it
The text is german but the pictures are nice: http://wiki.delphigl.com/index.php/glBlendFunc#Beispiele
thx for help,
best regards