美文网首页
Android OpenGL ES - 绘制点

Android OpenGL ES - 绘制点

作者: CHSmile | 来源:发表于2017-10-25 11:48 被阅读134次

一、一些基本概念

世界坐标系

世界坐标系就是3D绘图中像素的坐标。在3D绘图中,坐标轴遵循右手法则,让你右手手心正对自己,大拇指指向X轴正方向,拇指指向Y轴正方向,中指指向Z轴正方向。如下图所示


这里写图片描述

点的表示

空间中一个点具有(x,y,z)坐标。在Android系统中,可以用一个float数组、int数组等来表示一个点,比如

private float[] mArray = { 0f, 0f, 0f };

而在OpenGl ES中,为了提高性能,会把点、颜色等数组放在java.nio 包中定义的Buffer类中。类似于IO流中的缓冲。
创建一个工具类Utils,把获取Buffer数据的代码封装下

public class Utils {     
    /**
     * @param vertexs float 数组
     * @return 获取浮点形缓冲数据
     */
    public static FloatBuffer getFloatBuffer(float[] vertexs) {
        FloatBuffer buffer;
        ByteBuffer bf = ByteBuffer.allocateDirect(vertexs.length * 4);
        bf.order(ByteOrder.nativeOrder());
        buffer = bf.asFloatBuffer();
        //写入数组
        buffer.put(vertexs);
        //设置默认的读取位置
        buffer.position(0);
        return buffer;
    }    
}

二、绘制一个点

这里只贴上MyRenderer类的代码,其余代码和之前搭建的基础框架一样。

public class MyRenderer implements GLSurfaceView.Renderer {
        //顶点数组
        private float[] mArray = { 0f, 0f, 0f };
        // 缓冲区
        private FloatBuffer mBuffer;
        public MyRenderer() {
            //获取浮点形缓冲数据
            mBuffer = Utils.getFloatBuffer(mArray);
        }
        // Surface创建的时候调用
        @Override
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            // 设置清屏颜色为黑色
            gl.glClearColor(0f, 0f, 0f, 0f);
        }
        // Surface改变的的时候调用
        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            // 设置窗口大小
            gl.glViewport(width / 4, width / 2, width / 2, height / 2);
        }
        // 在Surface上绘制的时候调用
        @Override
        public void onDrawFrame(GL10 gl) {
            // 清除屏幕 
            gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
            // 允许设置顶点 // GL10.GL_VERTEX_ARRAY顶点数组
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            // 设置顶点
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mBuffer);
            //设置点的颜色为绿色
            gl.glColor4f(0f, 1f, 0f, 0f);
            //设置点的大小
            gl.glPointSize(80f);
            // 绘制点
            gl.glDrawArrays(GL10.GL_POINTS, 0, 1);
            // 禁止顶点设置
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        }
    }

1、定义顶点数组
我取了一个点的数组,定义x,y,z坐标为(0f,0f,0f)
2、获取浮点形缓冲数据
传入数组,获取浮点形缓冲数据,这一段代码是放在了构造函数里
3、设置清屏颜色
onSurfaceCreated里设置了清屏颜色为黑色,这样便于观看。
glClearColor是设置清屏颜色,类似的还有

  • glClearDepthf——指明深度缓冲区的清理值
  • glClearStencil——指明模板缓冲区的清理值

通过调用步骤4里的glClear方法清理。

glClearDepthf(float depth )指明的区间是0~1,初始值为1
glClearStencil(int s)指明模板缓冲区的清理值

4、清除屏幕

glClear(int mask) 方法是用来清理缓冲区,并设置为预设值。 mask的值有以下三种:

 GL_COLOR_BUFFER_BIT——表明颜色缓冲区

 GL_DEPTH_BUFFER_BIT——表明深度缓冲

 GL_STENCIL_BUFFER_BIT——表明模型缓冲区

5、允许设置顶点

glEnableClientState(int array) 调用这个方法来启用客户端的某项功能。对应的是glDisableClientState(int array) 禁用客户端的某项功能。
默认情况下,所有功能是被禁止的。
根据传递进入的int参数选择某项功能。 array 可以是下列符号常量:

GL_VERTEX_ARRAY ——如果启用,顶点矩阵可以用来写入

GL_COLOR_ARRAY————如果启用,颜色矩阵可以用来写入

GL_NORMAL_ARRAY—— 如果启用,  法线矩阵可以用来写入

GL_TEXTURE_COORD_ARRAY——如果启用,纹理坐标矩阵可以用来写入

GL_POINT_SIZE_ARRAY_OES(OES_point_size_arrayextension)——如果启用,点大小矩阵控制大小以渲染点和点sprites。这时由glPointSize 定义的点大小将被忽略,由点大小矩阵提供的大小将被用来渲染点和点sprites。

以上几种参数按顺序对应的专业名词是

  • 顶点 - 颜色 - 法线(用于光照处理) - 材质
  • 顶点
  • 颜色
  • 法线(用于光照处理)
  • 材质

6、设置顶点

glVertexPointer(int size, int type, int stride, Buffer pointer)是定义一个顶点坐标矩阵。传入四个参数

 size——每个顶点的坐标维数,必须是2, 3 或者4,初始值是4。
 type——指明每个顶点坐标的数据类型,允许的符号常量GL_BYTE, GL_SHORT,GL_FIXED 和GL_FLOAT,初始值为GL_FLOAT。
 stride——指明连续顶点间的位偏移,如果为0,顶点被认为是紧密压入矩阵,初始值为0。
 pointer——指明顶点坐标的缓冲区,如果为null,则没有设置缓冲区。

7、设置顶点的颜色为绿色
这个就是设置顶点的颜色
8、设置点的大小
这个就是设置顶点的大小
9、绘制顶点
glDrawArrays(int mode, int first, int count)传入三个参数,分别代表模式、绘制的起点、顶点数量
官方API解释如下:

mode——指明渲染哪一种图元。允许的符号常量有GL_POINTS,GL_LINE_STRIP,GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN 和GL_TRIANGLES。
first——指明在允许访问的矩阵中的起始索引。
count——指明要渲染的索引的数量。

OpenGL ES提供了两类方法来绘制一个空间几何图形:

public abstract void glDrawArrays(int mode, int first, int count) 使用VetexBuffer 来绘制,顶点的顺序由vertexBuffer中的顺序指定。
public abstract void glDrawElements(int mode, int count, int type, Buffer indices) ,可以重新定义顶点的顺序,顶点的顺序由indices Buffer 指定。

10、禁止顶点设置
绘制完成后,就关闭对应的功能。

三、效果

这里写图片描述

相关文章

网友评论

      本文标题:Android OpenGL ES - 绘制点

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