J'essaie de mélanger deux textures différentes (scène et nuages) qui sont obtenues à partir de FBO et les dessiner sur quad.LibGDX - superposer la texture au-dessus d'une autre texture en utilisant le shader
uniform sampler2D u_texture;
uniform sampler2D u_texture2;
uniform vec2 u_res;
void main(void)
{
vec2 texCoord = gl_FragCoord.xy/u_res.xy;
vec4 sceneColor = texture2D(u_texture, texCoord);
vec4 addColor = texture2D(u_texture2, texCoord);
gl_FragColor = sceneColor+addColor;
}
glBlendFunc est
Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
J'ai essayé toutes les combinaisons de glBlendFunc
et la combinaison ci-dessus était le meilleur.
Création FBOs:
fbClouds = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
fbScene = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
fbMix = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
nuages créant:
fbClouds.begin();
Gdx.gl.glClearColor(0, 0, 0, 0); // to make it transparent
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
modelBatch.begin(cam);
for (Integer e : drawOrder) {
if(isVisible(cam, clouds[e])){
drawLightning(e, modelBatch);
modelBatch.render(clouds[e], cloudShader);
modelBatch.flush();
}
}
modelBatch.end();
fbClouds.end();
rendre le code:
Gdx.gl20.glDisable(GL20.GL_BLEND);
//Gdx.gl20.glEnable(GL20.GL_BLEND);
//Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
fbMix.begin();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
mixShader.begin();
fbScene.getColorBufferTexture().bind(1);
mixShader.setUniformi("u_texture", 1);
fbClouds.getColorBufferTexture().bind(0);
mixShader.setUniformi("u_texture2", 0);
mixShader.setUniformf("u_res", Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
quad.render(mixShader, GL20.GL_TRIANGLES);
mixShader.end();
fbMix.end();
Alors, j'obtenir le résultat inattendu (les nuages ont absolument couleur blanche, mais ils devraient être gris):
En cas si j'utilise modelbatch
pour rendre les nuages le résultat est comme cela devrait être:
Quelle est la bonne façon de mélanger deux textures sans perdre la couleur?
Il devient blanc brillant parce que vous ajoutez du gris au bleu vif. Mais je ne suis pas sûr de votre description exactement ce qui se passe. Est-ce que ce mélange est ce que vous utilisez quand vous dessinez à l'un des FBO, ou ce que vous utilisez pour attirer tous vos FBO à l'écran? A l'intérieur de ce fragment de shader que vous avez utilisé, vous devez utiliser l'alpha de la texture du nuage pour multiplier par la texture du nuage et (1-alpha de la texture du nuage) pour multiplier par la texture du ciel. Mais vous devez vous assurer que le FBO de votre cloud prend en charge l'alpha et qu'il écrit sur ce canal alpha. Un peu compliqué. Peut-être qu'il y a un moyen plus facile? – Tenfour04
@ Tenfour04, quelle formule dois-je utiliser? Pourriez-vous me montrer en fonction de mon code source de shader? Les nuages peuvent être rouges ou verts, cela n'a pas d'importance. Ils sont devenus blancs dans tous les cas! – Nolesh
Je ne sais toujours pas exactement ce que vous faites. Si vous pouvez clarifier, je pense que j'ai une solution qui fonctionnerait. Vous montrez un fragment de shader en haut. Je pense que vous voulez dire que vous dessinez le ciel et le soleil à un FBO, et les nuages à un autre FBO. En supposant que c'est juste, comment dessinez-vous les nuages, avec une ModelInstance? Et quelle est la couleur claire du FBO sur lequel vous dessinez des nuages? Et est-ce que le mélange est ce que vous mentionnez ce que vous utilisez pour que les nuages les dessinent dans leur FBO, ou est-ce ce que vous utilisez pour dessiner votre Quad avec les deux FBO dans le buffer principal? – Tenfour04