2012-06-28 4 views
2

Je construis une application Android avec OpenGL.J'ai créé 2 carrés, chacun avec leurs propres textures (PNG), et les recouvre. D'après les conseils que j'ai reçus d'une question précédente, j'ai utilisé gl.glBlendFunc (GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); Mon problème est que l'effet de transparence, affecte le deuxième carré, pour que je puisse voir l'arrière-plan à travers la texture du second carré. Y at-il un moyen de contourner cela?Incrustation de transparence OpenGL Android

Voici le Renderer et au fond de la classe Square.java:

package hello.project; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.opengl.GLUtils; 

public class Square { 

private FloatBuffer vertexBuffer; // buffer holding the vertices 
static int sex=R.drawable.girl; 

private FloatBuffer textureBuffer; // buffer holding the texture coordinates 
private float texture[] = { 
    // Mapping coordinates for the vertices 
    0.0f, 1.0f, // top left (V2) 
    0.0f, 0.0f, // bottom left (V1) 
    1.0f, 1.0f, // top right (V4) 
    1.0f, 0.0f // bottom right (V3) 
}; 

private float vertices[] = { 
    -1.0f, -2.0f, 0.0f, // V1 - bottom left 
    -1.0f, 2.0f, 0.0f, // V2 - top left 
    0.8f, -2.0f, 0.0f, // V3 - bottom right 
    0.8f, 2.0f, 0.0f // V4 - top right 
}; 

public Square() { 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    vertexBuffer = byteBuffer.asFloatBuffer(); 
    vertexBuffer.put(vertices); 
    vertexBuffer.position(0); 

    byteBuffer = ByteBuffer.allocateDirect(texture.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    textureBuffer = byteBuffer.asFloatBuffer(); 
    textureBuffer.put(texture); 
    textureBuffer.position(0); 
} 

/** The draw method for the square with the GL context */ 
public void draw(GL10 gl) { 
    // bind the previously generated texture 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

    // Point to our buffers 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 



    // Set the face rotation 
    gl.glFrontFace(GL10.GL_CW); 

    // Point to our vertex buffer 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    // Draw the vertices as triangle strip 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

    //Disable the client state before leaving 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
} 




/** The texture pointer */ 
private int[] textures = new int[1]; 

public void loadGLTexture(GL10 gl, Context context,int sex) { 
    // loading texture 
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
    sex); 

    // generate one texture pointer 
    gl.glGenTextures(1, textures, 0); 
    // ...and bind it to our array 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 

    // create nearest filtered texture 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
    // Clean up 
    bitmap.recycle(); 
} 

public static int getSex() { 
    return sex; 
} 

public static void setSex(int sex) { 
    Square.sex = sex; 
} 
} 
--------------------------------------------------------------------------- 
package hello.project; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLU; 

public class HelloOpenGLES10Renderer implements Renderer { 

private Square square; // the square 
private Square2 square2; // the square 
private Context  context; 


/** Constructor to set the handed over context */ 
public HelloOpenGLES10Renderer(Context context) { 
    this.square = new Square(); 
    this.square2 = new Square2(); 
    this.context=context; 
} 

public void onDrawFrame(GL10 gl) { 
    // clear Screen and Depth Buffer 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Reset the Modelview Matrix 
    gl.glLoadIdentity(); 

    // Drawing 
    gl.glTranslatef(0.0f, 0.0f, -5.0f); // move 5 units INTO the screen 
    square.draw(gl); 
    square2.draw(gl); 


} 


public void onSurfaceChanged(GL10 gl, int width, int height) { 
    if(height == 0) {  //Prevent A Divide By Zero By 
    height = 1;  //Making Height Equal One 
    } 

    gl.glViewport(0, 0, width, height); //Reset The Current Viewport 
    gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Projection Matrix 
    gl.glLoadIdentity();  //Reset The Projection Matrix 

    //Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.1f, 100.0f); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); //Select The Modelview Matrix 
    gl.glLoadIdentity();  //Reset The Modelview Matrix 
} 


public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    // Load the texture for the square 

    square.loadGLTexture(gl, this.context,Square.getSex()); 
    square2.loadGLTexture(gl, this.context,Square2.getSex()); 

    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glEnable(GL10.GL_BLEND); 

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 

    gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background 
    gl.glClearDepthf(1.0f);  //Depth Buffer Setup 
    gl.glDepthFunc(GL10.GL_NEVER); //The Type Of Depth Testing To Do 

    //Really Nice Perspective Calculations 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
} 
} 
+0

Essayez de désactiver GL_BLEND après avoir dessiné le carré souhaité avec transparence. – Chris911

+0

Veuillez lier une image du problème, cela nous aidera à comprendre ce que vous essayez de faire. – Tim

+0

Suis-je le seul à avoir essayé de comprendre comment il utilise sa variable 'sexe' juste parce que c'est marrant? –

Répondre

2

Ne vous avez juste un problème avec l'état du pipeline graphique? Rappelez-vous quel carré vous dessinez pour être dessiné en premier à l'aide de la fonction de fusion actuellement active (et cela restera actif jusqu'à ce que vous changiez l'état OpenGL). Peut-être que vous voulez ajouter quelques changements d'état à la fonction de fusion, ou changer l'ordre de dessin pour obtenir l'effet que vous voulez? Vous pouvez également essayer d'activer/désactiver le test de profondeur entre les appels de dessin pour rendre un carré opaque.

J'espère que cela aide un peu, vous devrez peut-être fournir un peu plus de détails à votre question.

+0

J'ai édité le post avec une partie du code! Merci pour la réponse! –