Android Opengles 를 배우 고 게임 엔진 노트 하기(2)

프로젝트 파일: http://download.csdn.net/detail/li6185377/4194984
이전 장의 기본 도형 은 이미 그 릴 수 있다. 근 데 그림 이 없 으 면 안 돼 요.
opengl 그림 을 그 리 려 면 기본 적 인 도형 과 그림 이 필요 합 니 다.
전송 문: http://www.cnblogs.com/shengdoushi/archive/2011/01/13/1934181.html#sec-1.6
저 는 이 위 에 공부 하 는 거 예요.
그리고 L Game 엔진 을 배 워 서 만 든 거 예요. http://blog.csdn.net/cping1982 
알 고 나 서 저 희 는 Texture 를 봉인 합 니 다.
package ljh.opengl;

import java.util.HashMap;
import ljh.game.core.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;

public class LTexture {
        
	private int width, height, pow2Width, pow2Height;
	private Bitmap mBitmap;

	private float MaxW, MaxH;
	private int TextureID;
        //                          
	private LTexture parent = null;
        //              
	private float offsetX = 0, offsetY = 0;
        //      
	private int TexWidth, TexHeight;
        //   
	private HashMap<Integer, LTexture> subs = new HashMap<Integer, LTexture>();;

	private int Unused = 0;

	private LTexture() {

	}

	public LTexture(Bitmap bmp) {
              //        
		this.width = bmp.getWidth();
		this.height = bmp.getHeight();
		TexHeight = height;
		TexWidth = width;
		pow2Width = pow2(width);
		pow2Height = pow2(height);
		MaxW = width / (float) pow2Width;
		MaxH = height / (float) pow2Height;
		Bitmap bitmap = Bitmap.createBitmap(pow2Width, pow2Height, bmp
				.hasAlpha() ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
		Canvas canvas = new Canvas(bitmap);
		canvas.drawBitmap(bmp, 0, 0, null);

		bmp.recycle();
		bmp = null;
		this.mBitmap = bitmap;
	}

	public LTexture(String filename) {
		this(Resources.getBitmap(filename));
	}
        //                     String        Opengle                           
	public void addUnused() {
		Unused++;
	}
        
	public void bind(GLEx gl) {
		gl.glBind(this);
	}

	public void dispose() {
		TextureID = 0;
	}

	public Bitmap getBitmap() {
		if (this.parent != null) {
			return parent.getBitmap();
		}
		return this.mBitmap;
	}

	public int getHeight() {
		return height;
	}

	public float getMaxH() {
		return MaxH;
	}

	public float getMaxW() {
		return MaxW;
	}

	public float getOX() {
		return offsetX / pow2Width;
	}

	public float getOY() {
		return offsetY / pow2Height;
	}

	public int getPow2Height() {
		return pow2Height;
	}

	public int getPow2Width() {
		return pow2Width;
	}
         //    
	public LTexture getSubTexture(int x, int y, int width, int height) {

		if (x < 0)
			x = 0;
		if (y < 0)
			y = 0;
		if (width > this.width)
			width = this.width;
		if (height > this.height)
			height = this.height;
                //           
		LTexture sub = subs.get(x*100 + y + width + height);
		if (sub != null)
			return sub;

		sub = new LTexture();
		sub.parent = LTexture.this;
		if (TextureID != 0)
			sub.TextureID = this.TextureID;

		sub.pow2Width = this.pow2Width;
		sub.pow2Height = this.pow2Height;
		sub.width = width;
		sub.height = height;
		sub.offsetX = offsetX + x;
		sub.offsetY = offsetY + y;
		sub.TexWidth = TexWidth;
		sub.TexHeight = TexHeight;
                //   
		sub.MaxW = ((sub.offsetX + sub.width) / (float) this.pow2Width);
		sub.MaxH = ((sub.offsetY + sub.height) / (float) this.pow2Height);
		subs.put(x*100 + y + width + height, sub);
		return sub;
	}

	public int getTextureID() {
                //      
		Unused = 0;
		return this.TextureID;
	}

	public boolean isUnused() {
		if (this.parent == null && Unused > 20) {
			return true;
		}
		return false;
	}

	public int getWidth() {
		return width;
	}

	int pow2(int size) {
		int small = (int) (Math.log(size) / Math.log(2));
		if ((1 << small) >= size)
			return 1 << small;
		else
			return 1 << (small + 1);
	}

	public void recycle() {
		if (this.mBitmap != null) {
			if (this.mBitmap.isRecycled())
				this.mBitmap.recycle();
			this.mBitmap = null;
		}
	}
        //       ID    
	public void setTextureID(int id) {
		if (parent == null) {
			this.TextureID = id;
			for (LTexture sub : subs.values()) {
				sub.setTextureID(id);
			}
		} else if (this.parent.TextureID == 0) {
			this.parent.setTextureID(id);
		} else {
			this.TextureID = id;
			for (LTexture sub : subs.values()) {
				sub.setTextureID(id);
			}
		}

	}
}

그 가 있어 도 우 리 는 그림 을 그 릴 수 없다.왜냐하면 나 는 그의 호출 을 GL 의 패키지 에 넣 었 기 때문이다.
	public void delete(LTexture texture) {
		delete(texture.getTextureID());
		texture.recycle();
	}

	public void delete(int textureID) {
		if (textureID != 0) {
			gl.glDeleteTextures(1, new int[] { textureID }, 0);
			System.out.println("Delete Texture :" + textureID);
		}
	}

	public void drawTexture(LTexture texture,float x,float y)
	{	
		drawTexture(texture, x, y, texture.getWidth(), texture.getHeight());
	}
	public void drawTexture(LTexture texture,float x,float y,float width,float height)
	{				
		openTexture();		
		glBind(texture);
		//     Buffer
		FloatBuffer pointer = GLHelper.getVertex(x, y, width, height);
                //      
		FloatBuffer coord = GLHelper.getCoord(texture.getOX(),texture.getOY(),texture.getMaxW(), texture.getMaxH());		
                //   gl 
		gl.glVertexPointer(2, GL10.GL_FLOAT, 0, pointer);
		gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, coord);
		gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);		
		
		disableTexture();		
	}

	public void glBind(LTexture texture) {
		if (texture.getTextureID() == 0) 
		{						
			int[] textures = new int[1];			
			gl.glGenTextures(1, textures, 0);
			texture.setTextureID(textures[0]);
			gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.getTextureID());
                        //               
			gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
					GL10.GL_LINEAR);
			gl.glTexParameterx(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_REPEAT);
			gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);			
//			GL10.GL_CLAMP_TO_EDGE    
			//  Bitmap    
			GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, texture.getBitmap(), 0);
			// Bitmap    
			texture.recycle();
		}

		gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.getTextureID());
	}

정점 과 텍 스 처 맵 을 얻 을 수 있 는 패키지 도 있 습 니 다.
public static FloatBuffer getVertex(float x,float y,float width,float height)
	{
		ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8*4);
		byteBuffer.order(ByteOrder.nativeOrder());
		FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
		floatBuffer.put(new float[]{
				x,y,
				x+width,y,
				x,y+height,
				x+width,y+height
				
		});
		floatBuffer.position(0);
		return floatBuffer;
	}
	public static FloatBuffer getCoord(float maxW,float maxH)
	{
		return getCoord(0, 0, maxW, maxH);
	}
	public static FloatBuffer getCoord(float x,float y,float maxW,float maxH)
	{	
//		System.out.println(x+"  " + y + " " +maxW + "  "+ maxH );
		ByteBuffer byteBuffer = ByteBuffer.allocateDirect(8*4);
		byteBuffer.order(ByteOrder.nativeOrder());
		FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
		floatBuffer.put(new float[]{
				x,y,
				maxW,y,
				x,maxH,
				maxW,maxH
				
		});
		floatBuffer.position(0);
		return floatBuffer;
	}

좋은 웹페이지 즐겨찾기