2012-03-12 3 views
3

질감 아트 레이어를 사용하여 OpenGL에서 텍스처링하는 데 문제가 있습니다. 2 차원 게임을 만드는 중이며 POT 비트 맵을 오브젝트에 텍스처링하는 방법을 알고 있지만 성능상의 이유로 텍스처 맵을 사용하도록 코드를 변환하는 튜토리얼을 찾을 수없는 것 같습니다. 여기에 현재 작업 객체 생성 및 텍스처 구현을위한 코드가 있습니다.android에서 텍스처 아트라스 및 OpenGL 1.1을 사용한 샘플 텍스처링

public void createTexture(Bitmap bmp, GL10 gls, int texturename) 
    { 
     this.gl = (GL11) gls; 

     this.TextureName = texturename; 
     bombBmp = bmp; 

     VertexBuffer = null; 
     TextureBuffer = null; 
     IndexBuffer = null; 

     ByteBuffer byteBuffer = ByteBuffer.allocateDirect(12 * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     VertexBuffer = byteBuffer.asFloatBuffer(); 
     VertexBuffer.put(new float[] { 0, 0, 0.0f, 0, -h, 0.0f, w, 0, 0.0f, w, -h, 0.0f }); 
     VertexBuffer.position(0); 

     byteBuffer = ByteBuffer.allocateDirect(8 * 4); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     TextureBuffer = byteBuffer.asFloatBuffer(); 
     TextureBuffer.put(new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }); 
     TextureBuffer.position(0); 

     byteBuffer = ByteBuffer.allocateDirect(6 * 2); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     IndexBuffer = byteBuffer.asShortBuffer(); 
     IndexBuffer.put(new short[] { 0, 1, 2, 1, 3, 2 }); 
     IndexBuffer.position(0); 

     gl.glBindTexture(GL10.GL_TEXTURE_2D, this.TextureName); 
     gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     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, bombBmp, 0); 
     bombBmp.recycle(); 
     bombBmp = null; 
    } 

내 댓글에 응답 텍스처 비트 맵을

bomb_atlas.png

+1

텍스처 애스 타일에 관해 특별히 이해하지 못합니까? 텍스처 좌표가 어떻게 작동하는지 알고 있습니까? 나는 누군가가 당신을 위해 당신의 코드를 다시 작성할 것이라고 생각하지 않는다. 당신이 이해할 수없는 어떤 특정한 개념이 있다면 도움을 얻을 수있을 것이다. – Tim

+1

텍스쳐 아틀라스에서 서브 이미지를 바인딩하는 법을 모르겠다. 이미지를 전체적으로 바인딩하는 법만 알고있다. texImage2d를 먼저 사용하고 texSubImage를 사용해야 하나? 또는 texSubImage를 즉시 사용해야합니까? 감사합니다 – Keiichi

+0

어떻게 해결 했습니까? – hadez30

답변

1

을 해야하는 genTexture에서 내 Texturename를 생성하고이 기능 여기

gl.glGenTextures(1, textures, 0); 
bomb.createTexture(bombBmp, gl, textures[0]); 

에 POT 비트 맵을 통과, 당신은 돈 ' t 하위 이미지를 바인드합니다. glTexSubImage는 저장된 텍스처의 픽셀을 대체하는 데만 사용됩니다. 비트 맵이 표시된 것처럼 아틀라스로 이미 존재한다면, glTexImage2d를 통해 전체 텍스처를로드하고 바인드하면됩니다.

이미지의 특정 부분에 액세스하려는 경우 (첫 번째 줄의 왼쪽에서 노란색 원폭 3 번째로 말하기), 액세스하는 데 사용하는 텍스처 좌표 만 수정하면됩니다. 원이 자체 이미지에 있다면 (0,0)에서 (1,1) 좌표 만 사용하면되지만 다른 이미지의 일부이기 때문에 특정 부분 만 선택하면됩니다. 당신이 노란색 원 폭탄이 자신의 이미지를 가진 것처럼 정확히 보일 것이 texcoords와 쿼드을 그릴 경우

(.50,.75) //bottom left 
(.75,.75) //bottom right 
(.75,1.0) //top right 
(.50,1.0) //top left 

,하지만 당신은 텍스처를 리 바인드 유지할 필요가 없습니다 :이 사진에서 그것은의 texcoords있을 것입니다 항상 (따라서 성능이 향상됩니다).

+0

나를 위해 일들을 명확히 해 주셔서 고마워, 나에게 큰 도움이 될 것이다 :) – Keiichi