Проблема рисования квадратов, когда GLSurface является ПОЛУПРОЗРАЧНЫМ.Площадь рисуется дважды - PullRequest
0 голосов
/ 17 июня 2011

Я делаю свои первые шаги в OpenGL для 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);

в рамках действия он рисует квадрат хорошо и гладко, и только один раз. Но когда я делаю его полупрозрачным или даже прозрачным, он рисует два меньших квадрата, которые плохо прорисовываются при вращении мобильного телефона.

Если кто-нибудь знает, что происходит, это будет очень признательно.

Спасибо !!

1 Ответ

0 голосов
/ 20 июня 2011

Только что нашел решение, глядя на демоверсии. В рамках моей основной деятельности мне нужно установить средство выбора конфигурации 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.

...