본문 바로가기

프로그래밍/Android

안드로이드 맞고 - DrawManager


Draw Manager를 기술하기 위해서는 OpenGL을 모두 기술해야 한다.


OpenGL을 Surface로 사용하기 위해서는
public class 액티비티클래스 extends Activity
{
 private GLSurfaceView openGLView;                  // OpenGL View
 private OpenGL렌더러클레스 openGLRenderer;    // OpenGL Rendering View

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  // LCD(Backlight) ON
 
       openGLView = new GLSurfaceView(this);                           // Create OpenGL View
        openGLRenderer = new OpenGLRenderer(this);                  // Create OpenGL Renderer
        openGLView.setRenderer(openGLRenderer);                      // Set OpenGL Renderer

        setContentView(openGLView);                                          // Set View
    }
    /** Called when the activity is resumed. */
    @Override
    protected void onResume()
    {
        super.onResume();
        openGLView.onResume();
        openGLRenderer.onResume();
    }

    /** Called when the activity is paused. */
    @Override
    protected void onPause()
    {
        super.onPause();
        openGLView.onPause();
    }
}


public class OpenGL렌더러클레스 implements Renderer
{
    public OpenGL렌더러클레스()
    {
    }

    /** Called when the Surface is first created. */
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config)
    {
        //TODO: Surface 생성시 <1>
        //텍스쳐링을 사용할 경우 이곳에서 생성하고 설정한다.
        //맞고에서는 Menu클래스와 DrawManager를 이곳에서 생성하고 메뉴관련 텍스쳐링 정보를 모두 로드라고,
        //게임관련 텍스쳐링 정보는 Menu가 표시되는 동안 5개씩 나누어 onDrawFrame에서 로드한다. (런치타임 고려)
    }

    /** Called when the Surface is changed. */
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height)
    {
        //TODO: Surface 변경시 <2>
        //현재의 해상도가 전달되므로 해상도 관련 연산을 이곳에서 마무리 한다.
    }

    /** Called when the Surface is needed to draw. */
    @Override
    public void onDrawFrame(GL10 gl)
    {
        //TODO: frame draw <3 - 반복>
        //매 프래임에 화면출력되어야 할 사항을 명시한다.
        //맞고에서는 게임관련 텍스쳐링 정보 로드가 완료되는 시점에 GameManager를 생성한다.
    }
}


[Texture 설정]
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);

mTextureID = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

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);

gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

InputStream is = mContext.getResources().openRawResource(R.drawable.이미지파일명);
Bitmap bitmap;
try {
    bitmap = BitmapFactory.decodeStream(is);
} finally {
    try {
        is.close();
    } catch(IOException e) {
        // Ignore.
    }
}

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();



DrawManager는 ST_IMAGE class 배열에 모든 Image를 담고 있다.
ST_IMAGE class는 TextureID와 Bitmap Image 정보, 크기 등의 Texture Image 정보를 모두 담고 있다.
로드된 Texture image 정보를 사용하여 Draw요청이 있을 때 화면에 출력을 하게 된다.

[Draw]
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glLoadIdentity();

gl.glTranslatex(newPosX << 16, newPosY << 16, 0);
gl.glScalef(fScale, fScale, 0.0f);
gl.glRotatef(fRotate, 0.0f, 0.0f, 1.0f);

gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);

openGL.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);

glVertexPointer: nio 버퍼에 그려질 객체의 정점을 담아 전달
glTexCoordPointer: 이미지 대비 텍스쳐 좌표를 전달