Android Opengles 를 배우 고 게임 엔진 노트 하기(2)
이전 장의 기본 도형 은 이미 그 릴 수 있다. 근 데 그림 이 없 으 면 안 돼 요.
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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDOJ/HDU 1113 Word Amalgamation (사전 순서 ~ 지도)a dictionary, which consists of at least one and at most 100 words, one per line; a line containing XXXXXX, which signal...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.