Я делаю свои первые шаги в 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);
в рамках действия он рисует квадрат хорошо и гладко, и только один раз. Но когда я делаю его полупрозрачным или даже прозрачным, он рисует два меньших квадрата, которые плохо прорисовываются при вращении мобильного телефона.
Если кто-нибудь знает, что происходит, это будет очень признательно.
Спасибо !!