0

私のアプリケーション(Android、opengles 2.0)には2つのGLSurfaceViewがあります。そのうちの 2 つが重なっているので、その上をプレビューとして使用できます。私の問題は、アプリを起動すると、トップの glsurfaceview のコンテンツが消えることです (背景の glview とは異なる背景色を設定します。そのため、コンテンツの消失と GLview 全体の消失を区別できます)。どこから問題を探し始めればよいかわかりません。私のコードは以下のとおりです。

前もって感謝します。

package jp.android.MyProject;

import android.app.Activity;
import android.widget.TextView;

import android.view.ViewGroup.LayoutParams;
import android.os.Bundle;


public class MyProjectActivity extends Activity {


MyOpenGLView myGLView;
PreviewGLView previewView;
private int sizeofPreview = 300;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myGLView = new MyOpenGLView(this);
    setContentView(myGLView);
    myGLView.requestFocus();
    myGLView.setFocusableInTouchMode(true);

    previewView = new PreviewGLView(this);
    addContentView(previewView,new LayoutParams(sizeofPreview, sizeofPreview));

    previewView.setBackgroundColor(0xFF000000);

    myGLView.textWindow = new TextView(this);
    addContentView(myGLView.textWindow,new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    myGLView.touchWindow = new TextView(this);
    addContentView(myGLView.touchWindow, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    myGLView.touchWindow.setY(600.0f);
}

@Override
protected void onResume(){
    super.onResume();
    myGLView.onResume();
previewView.onResume();
}

@Override
protected void onPause(){
    super.onPause();
    myGLView.onPause();
    previewView.onPause();
}

}

4

1 に答える 1

1

Androidアプリケーションで2つの重複するGLSurfaceViewを使用できる(または使用することになっている)とは思いません。そのように設計されていないだけです

それを行うためのより良い方法は、メイン シーンとプレビュー シーンを描画するためのすべてのコードを GLSurfaceView.Renderer の 2 つの異なるメソッドに入れることです。

次にonDrawFrame(GL10 gl)、メインの draw メソッドを呼び出し、深度バッファをクリアしますが、カラー バッファはクリアしません。メソッドを呼び出して、メイン シーンの上にプレビューを描画します。onDrawFrame(GL10 gl)レンダラーの開始時に両方のバッファをクリアする必要があります

public class MyRenderer implements GLSurfaceView.Renderer {

/**
 * GLSurfaceView onto which stuff is rendered
 */
private GLSurfaceView mGLView;

/**
 * The current scene to render
 */
public MyScene mScene;

/**
 * The preview scene to draw over the top
 */
public MyScene mPreviewScene;

/**
 * 
 * @param The GLSurfaceView this renderer is attached to
 */
MyRenderer(GLSurfaceView mGLView;){
    this. mGLView =  mGLView;;
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    // clear the background
    gl.glClearColor(0, 0, 0, 1);

            // Enable depth testing
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthMask(true);
    gl.glDepthFunc(GL10.GL_LEQUAL);  

    // enable back face culling
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glFrontFace(GL10.GL_CCW);        
    gl.glCullFace(GL10.GL_BACK);

}

public void onSurfaceChanged(GL10 gl, int width, int height) {

    // set the new viewport width/height
    setViewportWidth(width);
    setViewportHeight(height);

}


public void onDrawFrame(GL10 gl) {

    // clear the canvas at the start of the draw call
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);


        // draw scene
        gl.glPushMatrix();

        // draw the foreground scene
        if(mScene!=null){
            mScene.draw(gl);
            // clear the depth buffer only!         
            gl.glClear(GL10.GL_DEPTH_BUFFER_BIT);
        }

        gl.glPopMatrix();

        gl.glPushMatrix();

        // draw the preview scene on top
        if(mPreviewScene!=null){
            mPreviewScene.draw(gl);
        }

        gl.glPopMatrix();


    return;

}
}

__

public interface MyScene{

    public void draw(GL10 gl);
}

__

public class MyOpenGLScene implements MyScene{

    // etc

}

__

public class PreviewGLScene implements MyScene{

    // etc

}

__

GLSurfaceView mGLView;
MyOpenGLScene myScene;
PreviewGLScene previewScene;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mGLView = new GLSurfaceView(this);
    MyRenderer renderer = new MyRenderer(mGLView);

    myScene = new MyOpenGLScene();
    previewScene = new PreviewGLScene();

    renderer.mScene = myScene;
    renderer.mPreviewScene = previewScene;

    mGLView.setRenderer(renderer);

    setContentView(myGLView);
}

注: ここでは呼び出しはすべて OpenGL ES 1.0 で行われていますが、OpenGL ES 2.0 と同等のものを簡単に見つけることができます。

また、実際に GLSurfaceView をオーバーライドする必要はありません (ただし、GLSurfaceView でレンダリングを行っている場合は、単一の GLSurfaceView に入れたメソッドを交換するだけMyRendererで、結果は同じになるはずです)。

于 2012-12-14T13:56:37.217 に答える