我是Android NDK和Native Activity的新手,我喜欢在屏幕中间创建一个三角形,但无论我怎么尝试,我都不会显示!
这是我的初始化方法:void Engine::initialize() {
LOGI("Engine::initialize fired!");
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
EGLint w, h, dummy, format;
EGLint numConfigs;
EGLConfig config;
EGLSurface surface;
EGLContext context;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
eglChooseConfig(display, attribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(this->app->window, 0, 0, format);
surface = eglCreateWindowSurface(display, config, this->app->window, NULL);
context = eglCreateContext(display, config, NULL, NULL);
if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
LOGW("Unable to eglMakeCurrent");
return;
}
eglQuerySurface(display, surface, EGL_WIDTH, &w);
eglQuerySurface(display, surface, EGL_HEIGHT, &h);
this->display = display;
this->context = context;
this->surface = surface;
this->width = w;
this->height = h;
// Initialize GL state.
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
glDisable(GL_DEPTH_TEST);
this->animating = true;
}
这是我的渲染方法:
void Engine::onRender() {
glClearColor(0.7, 0.1, 0.5, 1);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, this->width, this->height);
//glMatrixMode(GL_PROJECTION);
//glLoadIdentity();
//glFrustumf(-this->width / 2, this->width / 2, -this->height / 2, this->height / 2, 1, 3);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, 0);
GLfloat triangle[] = {
0, 0, 0,
0, 100, 0,
100, -100, 0
};
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0, 0, 0);
glColor4f(1.0f, 0.3f, 0.0f, .5f);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, triangle);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -10);
eglSwapBuffers(this->display, this->surface);
}
有人能帮忙吗?
我只能看到粉红色/紫色的背景,但知道任何其他像素:|控制台没有错误
您可能有OpenGL错误,但它们不会自动记录。您可以使用这个函数:
static void checkGlError(const char* op) {
for (GLint error = glGetError(); error; error = glGetError()) {
LOGI("after %s() glError (0x%x)n", op, error);
}
}
并在每次OpenGL调用后调用它。然后,您将看到它崩溃的确切位置。
在此基础上,我建议您使用OpenGL ES 2.0。我现在不确定是否您使用的所有调用都与ES 1.1一起工作(也许其他人可以确认)。此外,还有一个NDK示例实现了与您完全相同的功能,但使用的是ES 2.0。你可以在这里找到:
http://code.google.com/p/android-cmake/source/browse/samples/hello-gl2/jni/gl_code.cpp?r=787b14cf9ed13299cb4c729d9a67d06e300fd52e它使用一个简单的着色器来绘制三角形,并使用VBO来渲染它。
今天同样的问题困扰了我好几个小时,终于找到了答案。这不是代码上的错误,但很可能是测试设备上的错误。
第一:你是使用Android虚拟设备还是物理移动设备?
对于第一种情况,您需要使用ADV min API-15,并将gpu-emulation设置为yes。或者从命令行,您可以在运行ADV时使用这一行:
emulator -avd <avd_name> -gpu on
如果可以,您将在日志目录中找到这些行:
D/libEGL ( 595): loaded /system/lib/egl/libGLES_android.so
D/libEGL ( 595): loaded /system/lib/egl/libEGL_emulation.so
D/libEGL ( 595): loaded /system/lib/egl/libGLESv1_CM_emulation.so
D/libEGL ( 595): loaded /system/lib/egl/libGLESv2_emulation.so
否则,您可能只会发现第一个错误,以及类似"egl.cnf not found, falling back to default"的错误(查找帮助:https://developer.amazon.com/sdk/fire/enable-features.html#GPU)。
现在,如果你使用的是物理手机,我只是读到一些手机似乎不支持egl,主要是一些与CyanogenMod(他们在logcat中显示类似的错误)。在这种情况下,您应该在其他手机或具有上述规格的AVD上进行测试。