Android OpenGL10 基本图形绘制 <3>

下面程序的opengl的图形是根据Opengl1.0版本API进行的.

<a> : 首先绘制点:

<1> : 新建一个android studio工程,这个工程参考前一篇坐标系的.工程名:PumpKinBasicGL10,主类如下:

package org.durian.pumpkinbasicgl10;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

import org.durian.pumpkinbasicgl10.draw2d.PumpKinRenderer;
import org.durian.pumpkinbasicgl10.draw2d.dot.PumpkinDotRenderer;
import org.durian.pumpkinbasicgl10.draw2d.line.PumpKinLineRenderer;
import org.durian.pumpkinbasicgl10.draw2d.triangle.PumpKinTriangleRenderer;
import org.durian.pumpkinbasicgl10.draw3d.cube.PumpKinCubeRenderer;
import org.durian.pumpkinbasicgl10.draw3d.shapes.PumpKinPyramidRenderer;

public class MainActivity extends Activity {

    private GLSurfaceView mSurfaceView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSurfaceView=new GLSurfaceView(this);
        mSurfaceView.setRenderer(/*new PumpKinRenderer()*/new PumpkinDotRenderer()/*new PumpKinLineRenderer(this)*//*new PumpKinTriangleRenderer()*//*new PumpKinPyramidRenderer()*//*new PumpKinCubeRenderer()*/);
        setContentView(mSurfaceView/*R.layout.activity_main*/);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mSurfaceView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSurfaceView.onPause();
    }
}


<2> : 画点类程序如下:

package org.durian.pumpkinbasicgl10.draw2d.dot;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

/**
 * Created by Administrator on 2016/4/26.
 */
public class PumpKinDot {

    private FloatBuffer vertexsBuffer;

    private FloatBuffer colorsBuffer;

    //x,y,z
    private float[] vertexs=new float[]{
            1.0f,0.0f,0.0f,
            0.0f,1.0f,0.0f,
            -1.0f,0.0f,0.0f,
            0.0f,-1.0f,0.0f,
            0.5f,0.0f,0.0f,
            0.0f,0.5f,0.0f,
            -0.5f,0.0f,0.0f,
            0.0f,-0.5f,0.0f,
            0.0f,0.0f,0.0f,
            0.0f,0.0f,1.0f,
            0.0f,0.0f,-1.0f,
            0.0f,0.0f,0.5f,
            0.0f,0.0f,-0.5f,
            0.0f,0.0f,0.0f

    };

    //r,g,b,a
    private float[] colors={
            0.0f,1.0f,0.0f,1.0f,
            1.0f,0.0f,0.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,
            1.0f,1.0f,0.0f,1.0f,
            0.0f,1.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,1.0f,1.0f,1.0f,
            1.0f,1.0f,1.0f,1.0f,
    };

    public PumpKinDot(){

        ByteBuffer vbb=ByteBuffer.allocateDirect(vertexs.length*4);
        vbb.order(ByteOrder.nativeOrder());
        vertexsBuffer=vbb.asFloatBuffer();
        vertexsBuffer.put(vertexs);
        vertexsBuffer.position(0);

        ByteBuffer cbb=ByteBuffer.allocateDirect(colors.length*4);
        cbb.order(ByteOrder.nativeOrder());
        colorsBuffer=cbb.asFloatBuffer();
        colorsBuffer.put(colors);
        colorsBuffer.position(0);

    }

    public void draw(GL10 gl){

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexsBuffer);
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glColorPointer(4,GL10.GL_FLOAT,0,colorsBuffer);
        gl.glDrawArrays(GL10.GL_POINTS,0,vertexs.length/3);
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    }

}
上面程序主要是注意

gl.glDrawArrays(GL10.GL_POINTS,0,vertexs.length/3);

第一个参数为设置绘制图形类型.第一篇博客已有说明.

程序在x,y,z轴上面绘制画出多个点.

渲染的类:

package org.durian.pumpkinbasicgl10.draw2d.dot;

import android.opengl.GLSurfaceView;
import android.opengl.GLU;

import org.durian.pumpkinbasicgl10.draw2d.PumpKin;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

/**
 * Created by Administrator on 2016/4/26.
 */
public class PumpkinDotRenderer implements GLSurfaceView.Renderer {

    private PumpKinDot pumpKinDot;
    private PumpKin pumpKin;

    public PumpkinDotRenderer() {

        pumpKinDot = new PumpKinDot();
        pumpKin=new PumpKin();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        gl.glClearDepthf(1.0f);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glDisable(GL10.GL_DITHER);

    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {

        if (height == 0) {
            height = 1;
        }
        float aspect = (float) width / height;

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

        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        GLU.gluPerspective(gl, 45, aspect, 0.1f, 100.0f);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();

    }

    @Override
    public void onDrawFrame(GL10 gl) {

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

        gl.glLoadIdentity();
        gl.glTranslatef(0.0f, 0.0f, -6.0f);
        gl.glRotatef(45,1.0f,1.0f,1.0f);
        //pumpKin.draw(gl);
        pumpKinDot.draw(gl);


    }
}

上面对于的坐标线:

//pumpKin.draw(gl);

被注释了,这个绘制的坐标线不是必须的,只是让人可以更好定位三维空间位置,能够看得见.

运行结果:


如果将坐标系直线显示出来:


上面的在程序中,做了坐标变换:对坐标做了旋转变换.

gl.glRotatef(45,1.0f,1.0f,1.0f);

坐标线条程序和前一篇一模一样:

package org.durian.pumpkinbasicgl10.draw2d;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

/**
 * Created by Administrator on 2016/4/28.
 */
public class PumpKin {

    private FloatBuffer vertexsBuffer;
    private FloatBuffer colorsBuffer;

    private ByteBuffer indicesBuffer;

    private float vertexs[]={
            -3.0f,0.0f,0.0f,
            3.0f,0.0f,0.0f,
            0.0f,-3.0f,0.0f,
            0.0f,3
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值