From 2c646d3b0b747425d2c3a0cde7d78ed596bddb93 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Tue, 23 Nov 2010 16:47:48 +0000 Subject: [PATCH] Some code for the multitexture combiners functionality (GLES 1.1 fixed pipeline) --- .../processing/core/PGraphicsAndroid3D.java | 110 +++++++++++++++--- 1 file changed, 97 insertions(+), 13 deletions(-) diff --git a/android/core/src/processing/core/PGraphicsAndroid3D.java b/android/core/src/processing/core/PGraphicsAndroid3D.java index 56b03c178..b3bf6f6fe 100644 --- a/android/core/src/processing/core/PGraphicsAndroid3D.java +++ b/android/core/src/processing/core/PGraphicsAndroid3D.java @@ -1294,20 +1294,104 @@ public class PGraphicsAndroid3D extends PGraphics { public void multitextureBlend(int mode) { multitextureBlendMode = mode; - - // http://www.opengl.org/wiki/Texture_Combiners - // http://techconficio.ca/Blog/files/OpenGL_ES_multiTex_example.html - // http://www.khronos.org/opengles/documentation/opengles1_0/html/glTexEnv.html - // http://www.opengl.org/wiki/GLSL_:_common_mistakes (mix function for blending) - - /* - int t = GL11.GL_COMBINE_RGB; - t = GL11.GL_OPERAND0_RGB; - t = GL11.GL_SRC0_ALPHA; - t = GL11.GL_OPERAND1_ALPHA; - */ - } + + protected void setMulitextureCombiners(int[] glids) { + // http://www.opengl.org/wiki/Texture_Combiners + // http://www.khronos.org/opengles/sdk/1.1/docs/man/glTexEnv.xml + // http://techconficio.ca/Blog/files/OpenGL_ES_multiTex_example.html + + if (multitextureBlendMode == MULTIPLY) { + // multiply tex0 and tex1 + // The keyword here is GL_MODULATE, which does the actual multiplication. + gl11.glActiveTexture(GL11.GL_TEXTURE0); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[0]); + //Simply sample the texture + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL); + //------------------------ + gl11.glActiveTexture(GL11.GL_TEXTURE1); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[1]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); + //Sample RGB, multiply by previous texunit result + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_MODULATE); //Modulate RGB with RGB + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + //Sample ALPHA, multiply by previous texunit result + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_ALPHA, GL11.GL_MODULATE); //Modulate ALPHA with ALPHA + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_ALPHA, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_ALPHA, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); + } else if (multitextureBlendMode == BLEND) { + // Blend tex1 and tex2 based on alpha of tex0 + // The keyword here is GL_INTERPOLATE. + gl11.glActiveTexture(GL11.GL_TEXTURE0); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[0]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_DECAL); + //------------------------ + gl11.glActiveTexture(GL11.GL_TEXTURE1); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[1]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_DECAL); //Get RGB of this texture (tex1) + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + //------------------------ + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_ALPHA, GL11.GL_DECAL); //Get ALPHA of previous TUI (tex0) + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_ALPHA, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + gl11.glActiveTexture(GL11.GL_TEXTURE2); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[2]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_INTERPOLATE); //Interpolate RGB with RGB + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC2_RGB, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA); + //------------------------ + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_ALPHA, GL11.GL_INTERPOLATE); //Interpolate ALPHA with ALPHA + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_ALPHA, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_ALPHA, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC2_ALPHA, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA); + } else if (multitextureBlendMode == ADD) { + // Add tex0 and tex1 + // The keyword here is GL_ADD. + gl11.glActiveTexture(GL11.GL_TEXTURE0); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[0]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE); + //------------------------ + gl11.glActiveTexture(GL11.GL_TEXTURE1); + gl11.glBindTexture(GL11.GL_TEXTURE_2D, glids[1]); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_COMBINE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_RGB, GL11.GL_ADD); //Add RGB with RGB + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_RGB, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_RGB, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); + + // We have up to: + // GL11.GL_SRC2_RGB + // GL11.GL_OPERAND2_RGB + // ... + // + + + //------------------------ + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_COMBINE_ALPHA, GL11.GL_ADD); //Add ALPHA with ALPHA + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC0_ALPHA, GL11.GL_PREVIOUS); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_SRC1_ALPHA, GL11.GL_TEXTURE); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); + gl11.glTexEnvi(GL11.GL_TEXTURE_ENV, GL11.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); + } + } + + public void vertex(float x, float y) { super.vertex(x, y);