도전2022
MainView.java opengles android 본문
package com.book.opengl.texture;
import java.io.BufferedInputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer; //
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLContext;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
import javax.microedition.khronos.opengles.GL10;
public class MainView extends SurfaceView
implements SurfaceHolder.Callback
{
MainThread mMainThread;
Context mMainContext;
SurfaceHolder mHolder;
FloatBuffer vertexBuffer;
ShortBuffer indexBuffer; //
FloatBuffer vertexBufferTex;
int texMonkey;
Bitmap bitmapMonkey;
EGL10 mEGL;
EGLDisplay mGLDisplay;
EGLConfig mGLConfig;
EGLSurface mGLSurface;
EGLContext mGLContext;
GL10 mGL;
boolean mIsDraw = false;
int mWidth = 0;
int mHeight = 0;
int VERTEX_SIZE = 4*4; //
public MainView(Context r, AttributeSet a){
super(r, a);
getHolder().addCallback(this);
setFocusable(true);
mMainContext = r;
mHolder = getHolder();
mHolder.addCallback(this);
// mHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
}
public void init(int screenWidth, int screenHeight){
mWidth = screenWidth;
mHeight = screenHeight;
}
public void glInit(
EGL10 eGL,
EGLDisplay gLDisplay,
EGLConfig gLConfig,
EGLSurface gLSurface,
EGLContext gLContext,
GL10 gL ){
mEGL = eGL;
mGLDisplay = gLDisplay;
mGLConfig = gLConfig;
mGLSurface = gLSurface;
mGLContext = gLContext;
mGL = gL;
mGL.glViewport(0,0,mWidth, mHeight);
mGL.glClear(GL10.GL_COLOR_BUFFER_BIT);
mGL.glMatrixMode(GL10.GL_PROJECTION);
mGL.glLoadIdentity();
// mGL.glOrthof(0, 480,0,800,1,-1);
mGL.glOrthof(0, 1000, 0, 2000,1,-1);
float[] vertexArray ={
100.0f, 100.0f, 0.0f, 1.0f,
900.0f, 100.0f, 1.0f, 1.0f,
900.0f, 1900.0f, 1.0f, 0.0f,
100.0f, 1900.0f, 0.0f, 0.0f};
/*
float[] vertexArray ={
0.0f, 0.0f,
480.0f, 0.0f,
480.0f, 800.0f};
*/
// ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertexArray.length*4); //VERTEX_SIZE*4);
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(VERTEX_SIZE*4);
byteBuffer.order(ByteOrder.nativeOrder());
vertexBuffer = byteBuffer.asFloatBuffer();
vertexBuffer.put(vertexArray);
vertexBuffer.flip();
bitmapMonkey = loadBitmap("monkey.png");
int[] textures = new int[1];
mGL.glGenTextures(1, textures, 0);
texMonkey = textures[0];
mGL.glBindTexture(GL10.GL_TEXTURE_2D, texMonkey);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0 ,bitmapMonkey,0);
mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
mGL.glBindTexture(GL10.GL_TEXTURE_2D, 0);
bitmapMonkey.recycle();
//////////////////
short[] indexArray= new short[] {0,1,2,0,2,3};
ByteBuffer indBuffer = ByteBuffer.allocateDirect(indexArray.length*2); //3,2,4
indBuffer.order(ByteOrder.nativeOrder());
indexBuffer = indBuffer.asShortBuffer();
indexBuffer.put(indexArray);
indexBuffer.flip();
//////////////////
mIsDraw = true;
}
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height){
}
public void surfaceCreated(SurfaceHolder holder){
mWidth = this.getWidth();
mHeight = this.getHeight();
mMainThread = new MainThread(this, mWidth, mHeight);
mMainThread.start();
mIsDraw = true;
}
public void surfaceDestroyed(SurfaceHolder holder){
if (mMainThread != null) {
mMainThread.requestStop();
}
}
public void drawOpenGL(){
if(mIsDraw == false)
return;
/*
mGL.glClear(GL10.GL_COLOR_BUFFER_BIT);
mGL.glEnableClientState(GL10.GL_VERTEX_ARRAY);
mGL.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
vertexBuffer.position(0);
mGL.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
mGL.glEnable(GL10.GL_TEXTURE_2D);
mGL.glBindTexture(GL10.GL_TEXTURE_2D,texMonkey);
mGL.glTexCoordPointer(2, GL10.GL_FLOAT, 0, vertexBufferTex);
mGL.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
*/
mGL.glEnable(GL10.GL_TEXTURE_2D);
mGL.glBindTexture(GL10.GL_TEXTURE_2D,texMonkey);
mGL.glEnableClientState(GL10.GL_VERTEX_ARRAY);
mGL.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
vertexBuffer.position(0);
mGL.glVertexPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertexBuffer);
vertexBuffer.position(2);
mGL.glTexCoordPointer(2, GL10.GL_FLOAT, VERTEX_SIZE, vertexBuffer);
mGL.glDrawArrays(GL10.GL_TRIANGLES, 0,3);
mGL.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indexBuffer);
mEGL.eglSwapBuffers(mGLDisplay, mGLSurface);
}
private Bitmap loadBitmap(String filename){
Bitmap bm = null;
try{
AssetManager am = mMainContext.getAssets();
BufferedInputStream buf = new BufferedInputStream(am.open(filename) );
bm = BitmapFactory.decodeStream(buf);
}
catch(Exception ex){
}
return bm;
}
}
'작업 > work2013' 카테고리의 다른 글
안드로이드 문자열을 사용하다가 Multiple substitutions specified in non-positional format; did you mean to add the formatt ... 에러 발생시 (0) | 2013.12.23 |
---|---|
min3d (0) | 2013.11.29 |
차 크기 비교 (0) | 2013.11.25 |
skt 착신전화 (0) | 2013.11.04 |
Vector CANoe 문서 (0) | 2013.08.21 |