美文网首页
OpenGLES两种方式画立方体

OpenGLES两种方式画立方体

作者: 60916fc63567 | 来源:发表于2017-01-09 18:24 被阅读135次

其实两种方法都是画12个三角形画出来的,在OpenGL ES中,只支持三角形,所以任何复杂多边形都是由三角形画出来的。

第一种:顶点法

把一个四边形当成一个面,而一个面由两个三角形组成。一个三角形是不是有3个顶点?,所以一个面就有了3+3个顶点,一个立方体有6个面,6*6个顶点

此立方体的颜色也是根据顶点所渲染,正如定义这个立方体的顶点一样,不过它的参数可不是和定义顶点的一样哦,它的参数类型是:R,G,B,A,代表的是颜色值

public class OpenGlEsDemoActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

GLSurfaceView glview = new GLSurfaceView(this);

glview.setRenderer(new OpenGlRender());

setContentView(glview);

}

publicclassOpenGlRenderimplementsGLSurfaceView.Renderer{

//每一个面画两个三角形,立方体有6个面

privatefloat[] vertices={

-1.0f,1.0f,1f,// top left

-1.0f,-1.0f,1f,// bottom left

1.0f,-1.0f,1f,//top right

-1.0f,1.0f,1f,//bottom left

1.0f,-1.0f,1f,//bottom right

1.0f,1.0f,1f,//top right //前面

1.0f,1.0f,1f,

1.0f,-1.0f,1f,

1.0f,-1.0f,-1f,

1.0f,1.0f,1f,

1.0f,-1.0f,-1.0f,

1.0f,1.0f,-1f,//右面

-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,// top left

-1.0f,1.0f,1.0f,//bottom left

1.0f,1.0f,-1.0f,//top right

-1.0f,1.0f,1.0f,//bottom left

1.0f,1.0f,1.0f,//top right

1.0f,1.0f,-1.0f,// -top right上面

-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,//下面

};

//立方体的顶点颜色

privatefloat[] colors={

1f,0f,0f,1f,

1f,0f,0f,1f,

1f,0f,0f,1f,

1f,0f,0f,1f,

1f,0f,0f,1f,

1f,0f,0f,1f,

1f,0f,1f,1f,

1f,0f,1f,1f,

1f,0f,1f,1f,

1f,0f,1f,1f,

1f,0f,1f,1f,

1f,0f,1f,1f,

0f,1f,0f,1f,

0f,1f,0f,1f,

0f,1f,0f,1f,

0f,1f,0f,1f,

0f,1f,0f,1f,

0f,1f,0f,1f,

0f,0f,1f,1f,

0f,0f,1f,1f,

0f,0f,1f,1f,

0f,0f,1f,1f,

0f,0f,1f,1f,

0f,0f,1f,1f,

0.5f,0f,1f,1f,

0.5f,0f,1f,1f,

0.5f,0f,1f,1f,

0.5f,0f,1f,1f,

0.5f,0f,1f,1f,

0.5f,0f,1f,1f,

1f,0f,0.5f,1f,

1f,0f,0.5f,1f,

1f,0f,0.5f,1f,

1f,0f,0.5f,1f,

1f,0f,0.5f,1f,

1f,0f,0.5f,1f,

};

FloatBuffer vertBuffer;       //顶点缓冲

FloatBuffer colorBuffer;  //颜色缓冲

floatrx=-70f;            //旋转角度

publicOpenGlRender(){

ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);

vbb.order(ByteOrder.nativeOrder());

vertBuffer=vbb.asFloatBuffer();

vertBuffer.put(vertices);

vertBuffer.position(0);

ByteBuffer cbb= ByteBuffer.allocateDirect(colors.length*4);

cbb.order(ByteOrder.nativeOrder());

colorBuffer = cbb.asFloatBuffer();

colorBuffer.put(colors);

colorBuffer.position(0);

}

publicvoidonSurfaceCreated(GL10 gl, EGLConfig config) {

//启用深度测试

gl.glEnable(GL10.GL_DEPTH_TEST);

// 所做深度测试的类型

gl.glDepthFunc(GL10.GL_DITHER);

//黑色背景

gl.glClearColor(0f, 0f, 0f,0.5f);

//启用阴影平滑

gl.glShadeModel(GL10.GL_SMOOTH);

//清除深度缓存

gl.glClearDepthf(1.0f);

gl.glEnable(GL10.GL_TEXTURE_2D);

//告诉系统对透视进行修正

gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

}

publicvoiddraw(GL10 gl){

gl.glFrontFace(GL10.GL_CCW);

gl.glEnable(GL10.GL_CULL_FACE);

gl.glCullFace(GL10.GL_BACK);

//开启顶点和纹理缓冲

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT,0, vertBuffer);

gl.glColorPointer(4, GL10.GL_FLOAT,0, colorBuffer);

gl.glLoadIdentity();

gl.glTranslatef(0,0, -5);

gl.glRotatef(45f, 0f, 1f, 0f);        //往右边(y轴)倾斜45度C

gl.glRotatef(rx,1f, 0f, 0f);      //往上面倾斜(x轴)倾斜,根据每次得到的角度

gl.glDrawArrays(GL10.GL_TRIANGLES,0,vertices.length);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

gl.glDisableClientState(GL10.GL_COLOR_ARRAY);

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glDisable(GL10.GL_CULL_FACE);

rx--;         //旋转角度减1

}

publicvoidonDrawFrame(GL10 gl) {

// 清除深度和颜色缓存

gl.glClearColor(0f, 0f, 0f,0.5f);

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glMatrixMode(GL10.GL_MODELVIEW);//设置矩阵模式

draw(gl);

}

publicvoidonSurfaceChanged(GL10 gl,intwidth,intheight) {

gl.glViewport(0,0, width, height);

gl.glMatrixMode(GL10.GL_PROJECTION);

gl.glLoadIdentity();

GLU.gluPerspective(gl,45.0f, (float)width/(float)height,0.1f,100.f);

gl.glMatrixMode(GL10.GL_MODELVIEW);

gl.glLoadIdentity();

}

原文地址:http://blog.csdn.net/w8320273/article/details/8098970

第二种:索引法

}

相关文章

网友评论

      本文标题:OpenGLES两种方式画立方体

      本文链接:https://www.haomeiwen.com/subject/ltuhbttx.html