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. :)
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:
Nebo se přihlaste jménem a heslem:
Komentáře