当前位置:编程学习 > wap >>

安卓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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,