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

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则代表此颜色的最大强度。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值