美文网首页
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