Хорошо, после указателя от Сильвена Ратабуила (посмотрите его Книгу и страницу, если вы хотите ускориться на NDK7) в настройке OGLES на Android NDK 7. Мне не нужно генерировать и связывать буферы как они обрабатываются автоматически при настройке EGL Surface. Он предложил добавить это: -
EGL_DEPTH_SIZE, 16, EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
до
const EGLint lAttributes[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
EGL_BLUE_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_RED_SIZE, 5,
EGL_DEPTH_SIZE, 16, EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE };
Это исправило мой буфер глубины, обратите внимание, проверьте состояние EGL и убедитесь, что оно поддерживается. Вот полная реализация установки, которую я использовал: -
int32_t ES1Renderer::initialiseRenderer() {
EGLint lFormat, lNumConfigs, lErrorResult;
EGLConfig lConfig;
const EGLint lAttributes[] = { EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
EGL_BLUE_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_RED_SIZE, 5,
EGL_DEPTH_SIZE, 16, EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE };
mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mDisplay == EGL_NO_DISPLAY)
goto ERROR;
if (!eglInitialize(mDisplay, NULL, NULL))
goto ERROR;
if (!eglChooseConfig(mDisplay, lAttributes, &lConfig, 1, &lNumConfigs)
|| (lNumConfigs <= 0))
goto ERROR;
if (!eglGetConfigAttrib(mDisplay, lConfig, EGL_NATIVE_VISUAL_ID, &lFormat))
goto ERROR;
ANativeWindow_setBuffersGeometry(mApplication->window, 0, 0, lFormat);
mSurface = eglCreateWindowSurface(mDisplay, lConfig, mApplication->window,
NULL);
if (mSurface == EGL_NO_SURFACE)
goto ERROR;
mContext = eglCreateContext(mDisplay, lConfig, EGL_NO_CONTEXT, NULL);
if (mContext == EGL_NO_CONTEXT)
goto ERROR;
if (!eglMakeCurrent(mDisplay, mSurface, mSurface, mContext)
|| !eglQuerySurface(mDisplay, mSurface, EGL_WIDTH, &mWidth)
|| !eglQuerySurface(mDisplay, mSurface, EGL_HEIGHT, &mHeight)
|| (mWidth <= 0) || (mHeight <= 0))
goto ERROR;
{
const GLfloat matAmbient[] = { 1.0, 1.0, 1.0, 1.0 };
const GLfloat matDiffuse[] = { 1.0, 1.0, 1.0, 1.0 };
const GLfloat lightShininess = 20.0;
glEnable( GL_COLOR_MATERIAL);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, lightShininess);
}
glLoadIdentity();
#ifdef ORTHOGANAL_PROJECTION
glViewport( 0, 0, mWidth, mHeight );
#endif
glEnable ( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glDepthMask( GL_TRUE );
glEnable ( GL_CULL_FACE );
//glShadeModel( GL_SMOOTH );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glHint( GL_GENERATE_MIPMAP_HINT , GL_NICEST );
glHint( GL_LINE_SMOOTH_HINT , GL_NICEST );
glHint( GL_POINT_SMOOTH_HINT , GL_NICEST );
glHint( GL_FOG_HINT , GL_NICEST );
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glMatrixMode(GL_PROJECTION);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
//glShadeModel(GL_FLAT);
#ifdef ORTHOGANAL_PROJECTION
glOrthof(-1.0, //LEFT
1.0, //RIGHT
-1.0 * mHeight / mWidth, //BOTTOM
1.0 * mHeight / mWidth, //TOP
-2.0, //NEAR
100.0); //FAR
#else
{
GLfloat mWidthf = mWidth;
GLfloat mHeightf = mHeight;
const GLfloat zNear = 0.1;
const GLfloat zFar = 1000.0;
const GLfloat fieldOfView = 60.0;
GLfloat size = zNear * tanf(DEGREES_TO_RADIANS(fieldOfView) / 2.0);
glFrustumf(-size, size, -size / (mWidthf / mHeightf),
size / (mWidthf / mHeightf), zNear, zFar);
glViewport(0, 0, mWidthf, mHeightf);
}
#endif
glMatrixMode(GL_MODELVIEW);
}
Код визуализации остается таким же, как указано выше.