【问题标题】:Problem drawing squares when GLSurface is TRANSLUCENT. Square gets drawn twice当 GLSurface 为 TRANSLUCENT 时绘制正方形时出现问题。 Square 被绘制了两次
【发布时间】:2011-06-17 11:02:01
【问题描述】:

我在 OpenGL for Android 中迈出了第一步,用于开发增强现实应用程序,但我在相机图像前集成 OpenGL 形状时遇到了麻烦。该程序应该在相机图像上的 XZ 平面中绘制一个正方形(假设 Z 轴指向上方),但我得到了两个正方形,它们比我不使用相机时要小。

这里有一些代码。

在主要活动中,我这样设置视图和传感器:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Create an Instance with this Activity
    glSurface = new GLSurfaceView(this);
    //Set our own Renderer
    MyRenderer renderer = new Lesson02();
    glSurface.setRenderer(renderer);
    glSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);

    //Set the GLSurface as View to this Activity
    setContentView(glSurface);

    mCameraView = new CameraView(this);
    addContentView(mCameraView, new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT));

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    List<Sensor> listSensors = mSensorManager
            .getSensorList(Sensor.TYPE_ACCELEROMETER);
    if (listSensors.size() > 0) {
        mSensorManager.registerListener(renderer,
                listSensors.get(0), SensorManager.SENSOR_DELAY_UI);
    }

    listSensors = mSensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
    if (listSensors.size() > 0) {
        mSensorManager.registerListener(renderer,
                listSensors.get(0), SensorManager.SENSOR_DELAY_UI);
    }
}

我的渲染器的 onDraw 方法做这样的事情:

public void onDrawFrame(GL10 gl) {
    // Get rotation matrix from the sensor
    SensorManager.getRotationMatrix(rotationMatrix, null,
                                    mAccelerometerValues, mMagneticValues);
    // As the documentation says, we are using the device as a compass in
    // landscape mode
    SensorManager.remapCoordinateSystem(rotationMatrix,
                                        SensorManager.AXIS_Y, 
                                        SensorManager.AXIS_MINUS_X,
                                        remappedRotationMatrix);

    //Clear Screen And Depth Buffer
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    // Load remapped matrix
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    //Reset The Current Modelview Matrix
    gl.glLoadIdentity();    
    gl.glLoadMatrixf(remappedRotationMatrix, 0);

    // Draw square
    gl.glTranslatef(-1.2f, 18.0f, 0.0f);
    //gl.glTranslatef(0.0f, -1.2f, -6.0f);  //Move down 1.2 Unit And Into The Screen 6.0
    square.draw(gl);                        //Draw the square
}

最后,我初始化 onSurfaceCreated 方法中的所有内容,如下所示:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {       
    gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);            //Black Background
    gl.glClearDepthf(1.0f);                 //Depth Buffer Setup
    gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
    gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do

    /*
     * 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);
}

如果我评论该行

glSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);

在活动中,它会很好地平滑地绘制正方形,并且只绘制一次。但是当我让它半透明甚至透明时,它会画出两个较小的正方形,当我旋转手机时,它们画得不好。

如果有人知道发生了什么,将不胜感激。

谢谢!!

【问题讨论】:

    标签: android opengl-es augmented-reality translucency


    【解决方案1】:

    刚刚通过演示找到了解决方案。在我的主要活动中,我需要设置 EGL 配置选择器。这样的东西应该写在主要活动的onCreate方法中(我在其中添加了opengl视图和相机视图):

    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            //Create an Instance with this Activity
            glSurface = new GLSurfaceView(this);
            // We want an 8888 pixel format because that's required for a 
            //translucent window. And we want a depth buffer. 
            glSurface.setEGLConfigChooser(8, 8, 8, 8, 16, 0);  // <-- NEW LINE ADDED
            //Set our own Renderer
            MyRenderer renderer = new MyRenderer ();
            glSurface.setRenderer(renderer);
            glSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
    
            //Set the GLSurface as View to this Activity
            setContentView(glSurface);
    
            mCameraView = new CameraView(this);
            addContentView(mCameraView, new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
    
                    // More code ...
    }
    

    显然,这条线对于有一个半透明的 opengl 窗口是必要的。

    【讨论】:

      猜你喜欢
      • 2019-03-28
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多