2017-01-13 5 views
0
void setupViewPort(GLint width, GLint height) { 
glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

GLfloat aspect = (GLfloat)width/(GLfloat)height; 

glFrustumf(-1.0f, 1.0f, -1.0/aspect, 1.0/aspect, 1.5f, 40.0f); 


glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

gluLookAt(0, 0, 5,       //eyeXYZ 
    0.0f, 0.0f, -1.0f,     //centerXYZ 
    0.0f, 1.0f, 0.0f); 
} 

и ----------------------------- ------------------------------------------------opengl es in android native activity, gl_depth_test и gl_ depth_buffer_bit не работают

void eglInitSetting(GLManager* _glManager) { 
glManager = _glManager; 

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 
glDepthMask(true); 
} 

и -------------------------------------------- ---------------------------------

void eglInitDrawingObject() { 
rect = new GLRectangle(); 
tri = new GLTriangle(); 
circle = new GLCircle(); 
sphere = new GLSphere(); 
cube = new GLCube(); 
point = new GLPoint(); 
ecube = new GLECube(); 


//initailize each oject... 

glManager->object()->push_back(rect); 
glManager->object()->push_back(tri); 
glManager->object()->push_back(circle); 
glManager->object()->push_back(sphere); 
glManager->object()->push_back(cube); 
glManager->object()->push_back(point); 
glManager->object()->push_back(ecube); 
} 

и ....----- -------------------------------------------------- ----------------------

void eglDraw() { 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

i += 3; 
GLfloat angle = (float)(M_PI/180.0f) * i; 

GLfloat x = (float)(cos(angle)); 
GLfloat y = (float)(sin(angle)); 
//GLfloat z = (float)0.0f; 

point->move(x, y, 0.0f); 

sphere->rotate(0.0f, ry += 0.5f, 0.0f); 

rect->rotate(rx += 0.5f, 0.0f, 0.0f); 

cube->rotate(rx, ry, 0.0f); 
ecube->rotate(rx, ry, 0.0f); 

tri->rotate(0.0f, 0.0f, rz += 100.0f); 
circle->rotate(0.0f, 0.0f, rz += 100.0f); 

glManager->object()->drawAll(); 
glFlush(); 
} 

окончательно .. ------------------------------------- ------------------------------------

static int engine_init_display(struct engine* engine) { 

setupViewPort(engine->width, engine->height); 

GLManager* glManager; 
glManager = GLManager::getInstance(); 
glManager->object()->clearAll(); 
glManager->setAssetManager(engine->app->activity->assetManager); 

eglInitSetting(glManager); 
eglInitDrawingObject(); 

return 0; 
} 

static void engine_draw_frame(struct engine* engine) { 
if (engine->display == NULL) { 
    // No display. 
    return; 
} 
eglDraw(); 

eglSwapBuffers(engine->display, engine->surface); 
} 

, когда я рисую куб ...

Куб не показан должным образом.

, когда я использую тот же код на андроид версии Java, win32 OpenGL

это сделать совершенно ..

пожалуйста, помогите мне ..

что я должен делать?

ответ

0

Возможно, это связано с тем, что у вас нет буфера глубины. Убедитесь, что вы запрашиваете конфигурацию с помощью записи глубины при выборе конфигурации EGL для контекста рендеринга.

P.S. Не связаны, но не вызывайте glFlush() вручную. При вызове `eglSwapBuffers()` `автоматически будет очищаться при необходимости, а дополнительные списания могут привести к избыточной обработке графического процессора. Доверяйте водитель, чтобы сделать правильную вещь ...

+0

благодаря вашей помощи, я могу решить эту проблему. – keehl

0
const EGLint attribs[] = { 
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
    EGL_BLUE_SIZE, 8, 
    EGL_GREEN_SIZE, 8, 
    EGL_RED_SIZE, 8, 
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, 
    EGL_NONE 
}; 

добавить GL_DEPTH_SIZE

const EGLint attribs[] = { 
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT, 
    EGL_BLUE_SIZE, 8, 
    EGL_GREEN_SIZE, 8, 
    EGL_RED_SIZE, 8, 
    EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, 
    EGL_DEPTH_SIZE, 24, 
    EGL_NONE 
}; 

Я решить эту проблему ...