OpenGL ES学习之顶点和着色器的定义

来源:互联网 发布:c语言编程简单的小游戏 编辑:程序博客网 时间:2024/04/29 22:24

1.顶点、直线及三角形介绍
在OpenGL中,只能绘制点、直线和三角形,所有东西的结构都是从一个顶点开始。一个顶点就是一个代表几何对象的拐角的点,它有很多附加属性,其中最终要的属性就是位置,它代表这个顶点在空间中的定位。

  • 在代码中定义顶点
    如在我们的MyRenderer类的构造函数中添加如下代码构建一个长方形
public MyRenderer(Context context) {        this.context = context;        float[] tableVertices = {             0f,  0f,             0f, 14f,             9f, 14f,             9f,  0f         };    }
  • 在代码中构建三角形
    在OpneGL中,将单独的点放在一个组里构建出三角形。
public MyRenderer(Context context) {        this.context = context;        float[] tableVerticesWithTriangles = {            // Triangle 1            0f,  0f,             9f, 14f,            0f, 14f,            // Triangle 2            0f,  0f,             9f,  0f,                                        9f, 14f         };    }

这里写图片描述
这里说明下三角形的卷曲顺序:定义三角形时候,总是以逆时针顺序排列顶点,因为这样可以优化性能。

2.OpenGL存取顶点属性数组
利用java一个特殊的类集合分配本地内存块,将java的数据复制到本地内存。本地内存可以被本地环境存取,而不受垃圾回收器管控。

public MyRenderer(Context context) {        this.context = context;                 ·········        vertexData = ByteBuffer            .allocateDirect(tableVerticesWithTriangles.length * BYTES_PER_FLOAT)            .order(ByteOrder.nativeOrder())            .asFloatBuffer();        vertexData.put(tableVerticesWithTriangles);    }

使用 ByteBuffer.allocateDirect() 分配一块本地内存,这块内存大小为 tableVerticesWithTriangles.length * BYTES_PER_FLOAT 。调用 order(ByteOrder.nativeOrder()) 保证一个平台使用同样的排序,调用 asFloatBuffer() 得到一个可以反映底层字节的FloatBuffer类实例,之后调用 vertexData.put(tableVerticesWithTriangles) 将数据从Dalvik内存复制到本地内存。

3.使用着色器
将图形结构画到屏幕上之前,在OpenGL管道中传递,需要着色器的子例程。有两种类型的着色器,分别是顶点着色器和片段着色器。

  • 创建顶点着色器
    在项目中的“res”文件夹下创建“raw”文件夹,并创建如 vertex_shader.glsl文件,代码如下:
attribute vec4 a_Position;          void main()                    {                                  gl_Position = a_Position;    gl_PointSize = 10.0;}   
  • 创建片段着色器
    片段着色器的主要目的就是告诉GPU每个片段的最终颜色。
precision mediump float; uniform vec4 u_Color;                                           void main()                         {                                   gl_FragColor = u_Color;                                         }

4.将颜色映射到显示屏上
OpenGL假定颜色互相之间是线性关系,这些基本颜色值被限定在范围[0,1]内,0代表缺少此种基本颜色,1则代表此颜色的最大强度。

1 0
原创粉丝点击