OpenGL ES for Android 绘制线
时间:2022-07-24
本文章向大家介绍OpenGL ES for Android 绘制线,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
老
孟
一个
有态度
的程序员
永远缅怀,曼巴精神
下面将会完成绘制一条线,线的颜色由应用程序确定,顶点shader代码如下:
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
}
vPosition是顶点,由应用程序传入。
片段shader代码如下:
precision mediump float;
uniform vec4 u_color;
void main()
{
gl_FragColor = u_color;
}
u_color 表示线的颜色,由应用程序传入。
创建program:
fun createProgram() {
var vertexCode =
AssetsUtils.readAssetsTxt(
context = context,
filePath = "glsl/line_vs.glsl"
)
var fragmentCode =
AssetsUtils.readAssetsTxt(
context = context,
filePath = "glsl/line_fs.glsl"
)
mProgramHandle = GLTools.createAndLinkProgram(vertexCode, fragmentCode)
}
line_vs.glsl和line_fs.glsl分别表示顶点shader和片段shader的文件,存放于assets/glsl目录下,readAssetsTxt为读取assets目录下文件的公用方法。
获取参数句柄:
vPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "vPosition")
uColorLoc = GLES20.glGetUniformLocation(mProgramHandle, "u_color")
初始化线的顶点数据,代码如下:
val vertexBuffer = GLTools.array2Buffer(
floatArrayOf(
-0.5F, 0.5F, 0F,
0.5F, 0.5F, 0F,
0.5F, -0.5F, 0F,
-0.5F, -0.5F, 0F
)
)
初始化线的颜色数据,代码如下:
val colorBuffer = GLTools.array2Buffer(
floatArrayOf(
//r,g,b,a
1F, 0F, 0F, 1F
)
)
绘制:
override fun onDrawFrame(gl: GL10?) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
GLES20.glUseProgram(mProgramHandle)
vertexBuffer.position(0)
GLES20.glEnableVertexAttribArray(vPositionLoc)
GLES20.glVertexAttribPointer(vPositionLoc, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer)
GLES20.glUniform4fv(uColorLoc, 1, colorBuffer)
GLES20.glDrawArrays(GLES20.GL_LINES, 0, 4)
}
设置顶点数据和颜色数据,GLES20.GL_LINES表示绘制线。
线的绘制有3种方式:
- GL_LINES:俩俩组成一条直线,比如上面的4个点分别编号为1,2,3,4,1和2组成一条直线,3和4组成一条直线,如果点点个数为奇数,那么最后一个点将会抛弃。
- GL_LINE_STRIP:还是上面的4个点,1和2,2和3,3和4各组成一条直线。
- GL_LINE_LOOP:和GL_LINE_STRIP相比多了一个最后一个点和第一个点的连线。
效果图如下:
- 碎片化 | 第四阶段-49-hibernate之HQL查询操作-视频
- Spring Cloud各组件超时总结
- 总结Web应用中常用的各种Cache
- 碎片化 | 第四阶段-50-hibernate之Criteria和NavtiveSQL查询操作-视频
- kafka_2.11-0.11.0.1集群搭建
- Spring Cloud Edgware新特性之五:filters端点
- 碎片化 | 第四阶段-51-Hibernate注解使用-视频
- 基础JavaScript装逼指南
- 碎片化 | 第四阶段-42-校验验证码-视频
- Angularjs中UI Router超级详细的教程{{上}}
- 【LEETCODE】模拟面试-120- Triangle
- Spring Cloud Edgware新特性之四:Zuul routes端点功能增强
- Spring Cloud Edgware新特性之三:使用配置属性自定义Feign的行为
- 碎片化 | 第四阶段-43-struts2拦截器interceptor-视频
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 解决Linux+Apache服务器URL区分大小写问题
- Centos8(最小化安装)全新安装Python3.8+pip的方法教程
- 使用 Linux seq 命令生成数字序列(推荐)
- CentOS 7上为PHP5安装suPHP的方法(彭哥)
- Linux修改主机名命令详解
- 在CentOS 7.2上安装SuPHP的详细方法
- centos6-7 yum安装php的方法(推荐)
- Linux修改用户所属组的方法
- centos通过yum安装php的教程
- 树莓派4安装Ubuntu 19.10的教程详解
- Linux系统(CentOS7安装)安装JDK8的教程详解
- Deepin中安装与使用virtualenv的教程
- linux安装jdk并设置环境变量的方法教程(看这一篇够了)
- hadoop基于Linux7的安装配置图文详解
- Linux paste命令的使用方法