363번 포스트에 대한 질문을 정리해 봅니다.

  질문은 3D 모델을 안드로이드에 가져왔을때

  배경이 검게 나오는 상황입니다.

  모델은 어떤 그래픽 툴에서 그렸건 상관없을 것 

  같네요. 지금 전 Blender 를 선호하고 있지만,

  익숙한 툴을 사용하는게 제일 좋을 것 같고요.

  어찌됐건 안드로이드에서 보이기 위한 데이터는 

  vertices, colors, indices 로 각각 배열값을 가지고 있을 거라고 봅니다.

  모델은 잘보이는 것 같고요. 단지 배경이 검게 나오는 것이 문제로 보이는데

  363포스트에서 코드앞에 언급했다시피, 

  Cube.java 와 CubeRenderer.java 를 참조하고 있습니다.

  Cube.java 는 단지 모델을 그리는 용도이고, CubeRenderer.java 는 

  렌더링하는 속성들을 가지고 있다고 볼 수 있지요.

  카메라와 OpenGL을 동시에 오버레이 해서 보여줄려면, 

  우선 OpenGL의 그리는 배경속성이 투명해야 합니다.

  그래서 CubeRenderer.java 파일을 한번 보겠습니다.
----------------------------------------------------------------------------
package com.google.android.XXXXXX;

import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView;

/**
 * Render a pair of tumbling cubes.
 */

class CubeRenderer implements GLSurfaceView.Renderer {
    public CubeRenderer(boolean useTranslucentBackground) {
        mTranslucentBackground = useTranslucentBackground;
        mCube = new Cube();
    }

    public void onSensor(float x, float y){
     //float dx = x - mPreviousX;
        //float dy = y - mPreviousY;
     mAngleX = x; //+= dx ;
        mAngleY = y;//+= dy ;
     //return true;
    }
    
    public void onDrawFrame(GL10 gl) {
        /*
         * Usually, the first thing one might want to do is to clear
         * the screen. The most efficient way of doing this is to use
         * glClear().
         */

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        /*
         * Now we're ready to draw some 3D objects
         */

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
       
        gl.glTranslatef(0, 0, -3.0f);
        gl.glRotatef(mAngleX, 0, 1, 0);
        gl.glRotatef(mAngleY, 1, 0, 0);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

        mCube.draw(gl);

    }

    public int[] getConfigSpec() {
        if (mTranslucentBackground) {
                // We want a depth buffer and an alpha buffer
                int[] configSpec = {
                        EGL10.EGL_RED_SIZE,      8,
                        EGL10.EGL_GREEN_SIZE,    8,
                        EGL10.EGL_BLUE_SIZE,     8,
                        EGL10.EGL_ALPHA_SIZE,    8,
                        EGL10.EGL_DEPTH_SIZE,   16,
                        EGL10.EGL_NONE
                };
                return configSpec;
            } else {
                // We want a depth buffer, don't care about the
                // details of the color buffer.
                int[] configSpec = {
                        EGL10.EGL_DEPTH_SIZE,   16,
                        EGL10.EGL_NONE
                };
                return configSpec;
            }
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {
         gl.glViewport(0, 0, width, height);

         /*
          * Set our projection matrix. This doesn't have to be done
          * each time we draw, but usually a new projection needs to
          * be set when the viewport is resized.
          */

         float ratio = (float) width / height;
         gl.glMatrixMode(GL10.GL_PROJECTION);
         gl.glLoadIdentity();
         gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        /*
         * By default, OpenGL enables features that improve quality
         * but reduce performance. One might want to tweak that
         * especially on software renderer.
         */
        gl.glDisable(GL10.GL_DITHER);

        /*
         * Some one-time OpenGL initialization can be made here
         * probably based on features of this particular context
         */
         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
                 GL10.GL_FASTEST);

         if (mTranslucentBackground) {
             gl.glClearColor(0,0,0,0);
         } else {
             gl.glClearColor(1,1,1,1);
         }
         gl.glEnable(GL10.GL_CULL_FACE);
         gl.glShadeModel(GL10.GL_SMOOTH);
         gl.glEnable(GL10.GL_DEPTH_TEST);
    }
    private boolean mTranslucentBackground;
    private Cube mCube;
    public float mAngleX;
    public float mAngleY;
}

  위의 코드에서 녹색으로 표시된 부분이 투명한 처리를 하는 부분입니다.

즉, 363포스트에서 camGL 클래스에서 초기 생성시에 투명처리를 위해 아래와 같이 하는 부분이 있습니다.

                  mRenderer = new CubeRenderer(true);

        

        mGLSurfaceView = new GLSurfaceView(this);

                  //translucent

        mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        mGLSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);

        mGLSurfaceView.setRenderer(mRenderer);


translucent 부분이 투명처리하는 부분인데, 카메라부분인 preview 객체를 생성하지 않으면 바탕화면 위에


도형이 그려지는 것을 볼 수 있어야 합니다. 확인하려면, preview 객체 생성부분을 주석처리해서 확인해 보십시오.


만약 거기서도 바탕화면이 투명처리가 안된다면, 다음을 확인해 보시기 바랍니다. (AndroidManifest.xml, 적색코드)


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.google.android.XXXXX"

      android:versionCode="1"

      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".XXXXX"

                  android:label="@string/app_name"

                  android:theme="@android:style/Theme.Translucent">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

    <uses-sdk android:minSdkVersion="3" />

</manifest> 


한번 해보시고 결과를 댓글로 남겨주세요.


댓글을 달아 주세요

  1.  댓글주소  수정/삭제  댓글쓰기 영선님 2010.07.15 03:12 신고

    안녕하세요^^; 둘러보다 궁금한 점이 있어서 질문을 드리게 되었어요.

    배경화면 위에 도형이 그려지는 부분 까지는 성공 했답니다.

    그런데 저는 카메라 영상 위에 도형을 뿌리려는 것이 아니라,
    Framelayout 을 구성하여 이미지뷰 위에 GLView를 겹쳐서 보이게 하려고 하고 있거든요.
    배경 투명처리를 하지 않으면 이미지가 배경에 가려져 버리니.. 배경을 투명하게 만들어야만 했거든요.

    그런데 xml 레이아웃에서 ImageView와 GLView의 순서를 조정해 보아도
    항상 나중에 출력하는 것의 모습만 보이더라구요.
    즉, 이미지뷰의 그림만 보이거나, 바탕화면 위의 도형만 보이거나 이 2가지 경우가 되더군요 ㄷㄷ

    이미지를 오픈지엘 텍스쳐로 입히는 방법 외에,
    이 두가지 뷰를 겹쳐서 보이게 만드려면 어떻게 해야 할까요?

    안드로이드는 심오하군요 =_=