开发框架介绍请参见:Opengl ES NDK实例开发之一:搭建开发框架
【实例讲解】
本章在第二章的基础上讲解多边形的旋转
上图中的三角形和四边形沿着Y轴旋转
【实例源码】
[GLJNIActivity.java]
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * author: [email protected] * created: 2014/10/13 * purpose: 多边形的旋转 */ // OpenGL ES 1.x code #include <jni.h> #include <android/log.h> #include <GLES/gl.h> #include <GLES/glext.h> #include <stdio.h> #include <stdlib.h> #include <math.h> /************************************************************************/ /* 定义 */ /************************************************************************/ #define LOG_TAG "libgljni" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义π const GLfloat PI = 3.1415f; // 旋转角度 static GLfloat gAngle = 0.0f; // 顶点数组 const GLfloat gVertices[] = { 0.0f, 1.0f, 0.0f, // 上 -1.0f,-1.0f, 0.0f, // 左下 1.0f,-1.0f, 0.0f, // 右下 }; const GLfloat gVerticesSquare[] = { -1.0f, -1.0f, 0.0f, // 左下 1.0f, -1.0f, 0.0f, // 右下 -1.0f, 1.0f, 0.0f, // 左上 1.0f, 1.0f, 0.0f // 右上 }; // 颜色数组 const GLfloat gColors[] = { 1.0f,0.0f,0.0f, 1.0f, 0.0f,1.0f,0.0f, 1.0f, 0.0f,0.0f,1.0f, 1.0f, }; /************************************************************************/ /* C++代码 */ /************************************************************************/ static void printGLString(const char *name, GLenum s) { const char *v = (const char *) glGetString(s); LOGI("GL %s = %s\n", name, v); } static void checkGlError(const char* op) { for (GLint error = glGetError(); error; error = glGetError()) { LOGI("after %s() glError (0x%x)\n", op, error); } } bool init() { printGLString("Version", GL_VERSION); printGLString("Vendor", GL_VENDOR); printGLString("Renderer", GL_RENDERER); printGLString("Extensions", GL_EXTENSIONS); // 启用阴影平滑 glShadeModel(GL_SMOOTH); // 黑色背景 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 设置深度缓存 glClearDepthf(1.0f); // 启用深度测试 glEnable(GL_DEPTH_TEST); // 所作深度测试的类型 glDepthFunc(GL_LEQUAL); // 对透视进行修正 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return true; } static void _gluPerspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar) { GLfloat top = zNear * ((GLfloat) tan(fovy * PI / 360.0)); GLfloat bottom = -top; GLfloat left = bottom * aspect; GLfloat right = top * aspect; glFrustumf(left, right, bottom, top, zNear, zFar); } void resize(int width, int height) { // 防止被零除 if (height==0) { height=1; } // 重置当前的视口 glViewport(0, 0, width, height); // 选择投影矩阵 glMatrixMode(GL_PROJECTION); // 重置投影矩阵 glLoadIdentity(); // 设置视口的大小 _gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // 选择模型观察矩阵 glMatrixMode(GL_MODELVIEW); // 重置模型观察矩阵 glLoadIdentity(); } void renderFrame() { // 清除屏幕及深度缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 设置背景颜色为黑色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 重置当前的模型观察矩阵 glLoadIdentity(); // 启用顶点数组 glEnableClientState(GL_VERTEX_ARRAY); // 绘制三角形 glTranslatef(0.0f,2.0f,-10.0f); // 设置三角形位置 glRotatef(gAngle,0.0f,1.0f,0.0f); glEnableClientState(GL_COLOR_ARRAY); // 启用颜色数组 glColorPointer(4, GL_FLOAT, 0, gColors); // 指定颜色数组 glVertexPointer(3, GL_FLOAT, 0, gVertices); // 指定顶点数组 glDrawArrays(GL_TRIANGLES, 0, 3); // 绘制三角形 glDisableClientState(GL_COLOR_ARRAY); // 关闭颜色数组 // 绘制正方形 glTranslatef(0.0f,-4.0f,0.0f); // 设置正方形位置 glColor4f(1.0f, 0.0f, 0.0f, 1.0f); // 设置颜色为红色 glVertexPointer(3, GL_FLOAT, 0, gVerticesSquare); // 指定顶点数组 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // 绘制正方形 // 关闭顶点数组 glDisableClientState(GL_VERTEX_ARRAY); // 增加旋转角度 gAngle += 2.0f; } /************************************************************************/ /* JNI代码 */ /************************************************************************/ extern "C" { JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj, jint width, jint height); JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj); JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj); }; JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_resize(JNIEnv * env, jobject obj, jint width, jint height) { resize(width, height); } JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_step(JNIEnv * env, jobject obj) { renderFrame(); } JNIEXPORT void JNICALL Java_com_android_gljni_GLJNILib_init(JNIEnv * env, jobject obj) { init(); }