カメラ用の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 件のコメント:
コメントを投稿