Průhledná textura rubrika: Programování: Android

4 velepetr
položil/-a 25.11.2014

Dobrý den,
Mám jeden problém. Místo průhledné rendruji černou. Dlouho jsem hledal na Googlu a myslím že musím povolit míchání barev a pak změnit černou na průhlednou, ale nějak mi to nechce fungovat. Můžete mi někdo prosím vás poradit co a kde mám udělat. :)

Děkuji

Píši to v jazyce java, grafickou knihovnu opengl 1.0, obrázek 2107 x 925 v .png. Normálně vykresluje texturu jak má až na průhlednou barvu ta se mi vykresluje jako úplně černá(díval jsem se na ni v malováni na screenshot). Vše je ve 2D.

načtení obrázku:

public class Textures {
    private int[] textures = new int[15]; 
 
    public Textures(GL10 gl) { 
        gl.glGenTextures(15, textures, 0);
    } 
 
    public int loadTexture(GL10 gl, int texture, Context context,
                             int textureNumber)   { 
 
 
        InputStream imagestream = context.getResources().openRawResource(texture); 
        Bitmap bitmap = null; 
 
        try { 
            bitmap = BitmapFactory.decodeStream(imagestream); 
        }
        catch(Exception e) { 
        }
        finally { 
            try { 
                imagestream.close(); 
                imagestream = null; 
            } 
            catch (IOException e) { 
 
            } 
        } 
 
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[textureNumber ]); 
        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); 
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
                           GL10.GL_CLAMP_TO_EDGE); 
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
                           GL10.GL_CLAMP_TO_EDGE); 
 
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 
        bitmap.recycle(); 
 
        return textures[textureNumber]; 
    } 
 
}
 
 public void decodeTextures(GL10 gl){
            Engine.textureLoader = new Textures(gl);
            Engine.PlayerSheets = Engine.textureLoader.loadTexture(gl, Engine.PLAYER_SHIP[Engine.gameOptions], 
                    Engine.context, 1); 
                 ....
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
        gl.glEnable(GL10.GL_BLEND);  
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glEnable(GL10.GL_DEPTH_TEST); 
        gl.glDepthFunc(GL10.GL_LEQUAL);  
 
        initialize.initializeNumber();
        initialize.initializeNumberGameOver();
        initialize.initializeIcons();
        initialize.initializeTexts();
        initialize.decodeTextures(gl); 
...
 
    }

vykreslení

private void movePlayer4(GL10 gl) { 
           ...//vypocet polohy
        player1.posY+= Engine.shootingMove[1];
        gl.glMatrixMode(GL10.GL_MODELVIEW); 
        gl.glLoadIdentity(); 
        gl.glPushMatrix(); 
        gl.glTranslatef(player1.posX,player1.posY, .75f);
        gl.glScalef(1.7f, 1.7f, 2f); 
            gl.glMatrixMode(GL10.GL_TEXTURE); 
            gl.glLoadIdentity(); 
            gl.glTranslatef(player1.posXTex,player1.posYTex, 0.0f);
            gl.glScalef(player1.Scalef, 1f, 1f); 
            player1.draw(gl,PlayerSheets); 
            gl.glPopMatrix(); 
            gl.glLoadIdentity();           
 
            player1.t+=player1.tPlus;
            player1.posXTex=player1.numberOfTexture*((player1.t/player1.framePerSecond-((player1.t%player1.framePerSecond)/player1.framePerSecond))%player1.maxTextur)+player1.posT;
 
   }
public class GoodGuy {
 
    public GoodGuy(float texture[],float X,float Y,boolean a,float textureX,float textureY,float speedX,float speedY,int hlt) { 
 
        ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); 
        byteBuf.order(ByteOrder.nativeOrder()); 
        vertexBuffer = byteBuf.asFloatBuffer(); 
        vertexBuffer.put(vertices); 
        vertexBuffer.position(0); 
 
        byteBuf = ByteBuffer.allocateDirect(texture.length * 4); 
        byteBuf.order(ByteOrder.nativeOrder()); 
        textureBuffer = byteBuf.asFloatBuffer(); 
        textureBuffer.put(texture); 
        textureBuffer.position(0); 
 
        indexBuffer = ByteBuffer.allocateDirect(indices.length); 
        indexBuffer.put(indices); 
        indexBuffer.position(0);
         .... //moje promenne
    } 
 
    public void draw(GL10 gl,int textures) { 
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures); 
        gl.glFrontFace(GL10.GL_CCW); 
        gl.glEnable(GL10.GL_CULL_FACE); 
        gl.glCullFace(GL10.GL_BACK); 
 
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
 
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 
 
        gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, 
                          GL10.GL_UNSIGNED_BYTE, indexBuffer); 
 
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
        gl.glDisable(GL10.GL_CULL_FACE); 
    }
 

To je snad vše. :)

Komentáře

  • roman.hocke : Udělej to, že pořádně popíšeš problém :-) V čem to píšeš? Jaké používáš na to kreslení knihovny? Ukaž kus kódu, který má dělat TO a místo toho dělá ONO. Je v tom obrázku černá fakt černá? Není to o odstín jiná barva? Atd. 21.11.2014
odkaz
4 velepetr
odpověděl/-a 22.12.2014

Nakonec jsem to vyšil opačným pořadím vykreslování než to bylo v knížce. Nejdříve to co je nejdál a pak to blíže.

Komentáře

  • Augi : Jo, průhledné věci musíš kreslit jako poslední (až po všech neprůhledných věcech), a seřazené odzadu dopředu. Pokud k ničemu nebudeš dále používat Z-buffer, tak můžeš při renderingu těch průhledných věcí vypnout zápis do Z-bufferu, čímž ušetříš nějaký výkon. Z-test musíš nechat zapnutý. 23.12.2014

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.