安卓opengl绘制正方体每个面只绘制了一个三角形,求解决填满,有真相
如图,下面的三角体正常,上面的正方体每个面只绘制了一个三角形,有另一个三角形空缺,怎么填满,以下是源码,android中jni调用opengl:
bool init() { // 此处开始对OpenGL进行所有设置
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; // 初始化 OK
}
/*
* 三角形的
*/
const GLfloat gVertices[] = {
0.0f, 1.0f, 0.0f, //三角形的上顶点(前侧面)
-1.0f,-1.0f, 1.0f, //三角形的左下顶点(前侧面)
1.0f,-1.0f, 1.0f, //三角形的右下顶点(前侧面)
0.0f, 1.0f, 0.0f, //三角形的上顶点(右侧面)
1.0f,-1.0f, 1.0f, //三角形的左下顶点(右侧面)
1.0f,-1.0f, -1.0f, //三角形的右下顶点(右侧面)
0.0f, 1.0f, 0.0f, //三角形的上顶点(后侧面)
1.0f,-1.0f, -1.0f, //三角形的左下顶点(后侧面)
-1.0f,-1.0f, -1.0f, //三角形的右下顶点(后侧面)
0.0f, 1.0f, 0.0f, //三角形的上顶点(左侧面)
-1.0f,-1.0f,-1.0f, //三角形的左下顶点(左侧面)
-1.0f,-1.0f, 1.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,
1.0f,0.0f,0.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
1.0f,0.0f,0.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
1.0f,0.0f,0.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f
};
/*
* 正方形的
*/
const GLfloat gVertices_rect[] = {
1.0f, 1.0f, -1.0f, //四边形的右上顶点(顶面)
-1.0f,1.0f, -1.0f, //四边形的左上顶点(顶面)
-1.0f,1.0f, 1.0f, //四边形的左下顶点(顶面)
1.0f,1.0f, 1.0f, //四边形的右下顶点(顶面)
1.0f, -1.0f, 1.0f, //四边形的右上顶点(底面)
-1.0f,-1.0f, 1.0f, //四边形的左上顶点(底面)
-1.0f,-1.0f, -1.0f, //四边形的左下顶点(底面)
1.0f,-1.0f, -1.0f, //四边形的右下顶点(底面)
1.0f, 1.0f, 1.0f, //四边形的右上顶点(前面)
-1.0f,1.0f, 1.0f, //四边形的左上顶点(前面)
-1.0f,-1.0f, 1.0f, //四边形的左下顶点(前面)
1.0f,-1.0f, 1.0f, //四边形的右下顶点(前面)
1.0f, -1.0f, -1.0f, //四边形的右上顶点(后面)
-1.0f,-1.0f, -1.0f, //四边形的左上顶点(后面)
-1.0f,1.0f, -1.0f, //四边形的左下顶点(后面)
1.0f,1.0f, -1.0f, //四边形的右下顶点(后面)
-1.0f, 1.0f, 1.0f, //四边形的右上顶点(左面)
-1.0f,1.0f, -1.0f, //四边形的左上顶点(左面)
-1.0f,-1.0f, -1.0f, //四边形的左下顶点(左面)
-1.0f,-1.0f, 1.0f, //四边形的右下顶点(左面)
1.0f, 1.0f, -1.0f, //四边形的右上顶点(右面)
1.0f,1.0f, 1.0f, //四边形的左上顶点(右面)
1.0f,-1.0f, 1.0f, //四边形的左下顶点(右面)
1.0f,-1.0f, -1.0f, //四边形的右下顶点(右面)
};
/*
* 正方形的
*/
const GLfloat gColors_rect[] = {
1.0f,0.0f,0.0f, 1.0f,
1.0f,0.0f,0.0f, 1.0f,
1.0f,0.0f,0.0f, 1.0f,
1.0f,0.0f,0.0f, 1.0f,
1.0f,1.0f,0.0f, 1.0f,
1.0f,1.0f,0.0f, 1.0f,
1.0f,1.0f,0.0f, 1.0f,
1.0f,1.0f,0.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
0.0f,1.0f,0.0f, 1.0f,
0.0f,1.0f,1.0f, 1.0f,
0.0f,1.0f,1.0f, 1.0f,
0.0f,1.0f,1.0f, 1.0f,
0.0f,1.0f,1.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
0.0f,0.0f,1.0f, 1.0f,
1.0f,1.0f,1.0f, 1.0f,
1.0f,1.0f,1.0f, 1.0f,
1.0f,1.0f,1.0f, 1.0f,
1.0f,1.0f,1.0f, 1.0f,
};
static GLfloat rtri; //三角形的旋转变量,用于三角形的角度
static GLfloat rquad; //四边形的旋转变量,用于四边形的角度
const GLfloat PI = 3.1415f;
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) // 重置OpenGL窗口大小
{
if (height==0) // 防止被零除
{
height=1; // 将Height设为1
}
glViewport(0, 0, width, height); // 重置当前的视口
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// GLfloat ratio = (GLfloat)width/(GLfloat)height;
// 设置视口的大小
_gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
// glOrthof(-2.0f, 2.0f, -2.0f, 2.0f, -2.0f, 2.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
void renderFrame() { // 从这里开始进行所有的绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(-0.3f,-2.0f, -10.0f); // 左移0.3单位,并移入屏幕 10.0
glRotatef(rtri,0.0f,1.0f,0.0f); // 绕Y轴旋转金字塔
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, gColors);
glVertexPointer(3, GL_FLOAT, 0, gVertices);
glDrawArrays(GL_TRIANGLES, 0, 12);
//关闭颜色渲染功能
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY); //画立方体
glLoadIdentity(); // 重置当前的模型观察矩阵
glTranslatef(0.5f,1.5f,-8.0f); // 先右移再移入屏幕
glRotatef(rquad,1.0f,1.0f,1.0f); // 绕XYZ轴旋转立方体
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 0, gColors_rect);
glVertexPointer(3, GL_FLOAT, 0, gVertices_rect);
for(int i = 0; i < 6; i ++){
glDrawArrays(GL_TRIANGLES, i*4, 4);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
rtri += 3.2f; // 增加三角形的旋转变量
rquad -= 1.5f; //减少四边形的旋转变量
glFlush();
}
extern "C" {
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_resize(JNIEnv * env, jobject obj, jint width, jint height);
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_step(JNIEnv * env, jobject obj);
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_init(JNIEnv * env, jobject obj);
};
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_resize(JNIEnv * env, jobject obj, jint width, jint height)
{
resize(width, height);
}
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_step(JNIEnv * env, jobject obj)
{
renderFrame();
}
JNIEXPORT void JNICALL Java_com_huazhou_test_ndk_GL10JNILib_init(JNIEnv * env, jobject obj)
{
init();
}
补充:移动开发 , Android