カメラ用のSurfaceView作って、FrameLayoutでOpenGLのViewと重ねるだけじゃん? って思ってたら結構はまりました。
いろんなところですでに言われてますが、
①普通に考えるとカメラの画像にOpenGLを重ねるので、
カメラビューの追加 → OpenGLビューの追加
となると思いきや、
OpenGLビューの追加 → カメラビューの追加
にしないといけない罠
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout layout = new FrameLayout(this); setContentView(layout); layout.addView(new GameView(this, new OpeningScene(), 640, 480)); layout.addView(new CameraSurfaceView(this)); }
②OpenGLの方のピクセルフォーマットを透過にしなければいけない罠+ChoosConfigの時にEGL_ALPHA_SIZEを指定しないと機種によっては表示がバグる罠。
※でもなんか、PixelFormat.RGBA_8888でも大丈夫だった、うん?
getHolder().setFormat(PixelFormat.RGBA_8888); getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU); getHolder().addCallback(this);
int[] spec = { EGL10.EGL_ALPHA_SIZE,1, EGL10.EGL_DEPTH_SIZE,1, EGL10.EGL_NONE }; EGLConfig[] configs = new EGLConfig[1]; egl.eglChooseConfig(display, spec, configs, 1, new int[1]);
③glClearColorのアルファの指定を1以外にしないとカメラビューが映らない罠
public static void clear() { Global.gl.glClearColor(1,1,1,0); Global.gl.glEnable(GL10.GL_DEPTH_TEST); Global.gl.glDepthMask(true); // 深度バッファ書き込み有効 Global.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); }
ARとか程遠い。
0 件のコメント:
コメントを投稿