OpenGL ES for Android 绘制一个点
时间:2022-07-24
本文章向大家介绍OpenGL ES for Android 绘制一个点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
老
孟
一个
有态度
的程序员
在Android中开发OpenGL ES的应用程序是无法调试 shader代码的,因此绘制点是一个很好的调试方法,为了定位问题经常会将一些结果输出的屏幕上,比如人脸识别关键点项目,想要确定人脸关键点是否正确,将关键点绘制在人脸对应位置上可以很好的展示人脸关键点正确与否。
下面将会完成绘制一个点,点的颜色由应用程序确定,顶点shader代码如下:
attribute vec4 vPosition;
void main() {
gl_Position = vPosition;
gl_PointSize = 5.0;
}
vPosition是点绘制的位置,由应用程序传入,gl_PointSize是内置变量,代表点的大小,单位是像素、像素、像素,重要的事情说3遍,另外点的形状为方形、方形、方形,不是圆形,因为像素都是方形的。
有人会问单位是像素岂不是无法适配,在低分辨率的设备上显示比高分辨率要大,如果想绘制一个100分之一大小的点如何绘制啊?如果想绘制100分之一大小的点可以按照绘制方形的形式绘制。
绘制一点的片段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/point_vs.glsl"
)
var fragmentCode =
AssetsUtils.readAssetsTxt(
context = context,
filePath = "glsl/point_fs.glsl"
)
mProgramHandle = GLTools.createAndLinkProgram(vertexCode, fragmentCode)
}
point_vs.glsl和point_fs.glsl分别表示顶点shader和片段shader的文件,存放于assets/glsl目录下,readAssetsTxt为读取assets目录下文件的公用方法。
获取参数句柄:
vPositionLoc = GLES20.glGetAttribLocation(mProgramHandle, "vPosition")
uColorLoc = GLES20.glGetUniformLocation(mProgramHandle, "u_color")
初始化顶点数据,代码如下:
val vertexBuffer = GLTools.array2Buffer(
floatArrayOf(
0F, 0F, 0F
)
)
初始化颜色数据,代码如下:
val colorBuffer = GLTools.array2Buffer(
floatArrayOf(
//r,g,b,a
0F, 1F, 0F, 1F
)
)
绘制:
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_POINTS, 0, 1)
设置顶点数据和颜色数据,GLES20.GL_POINTS表示绘制点。
- 一个只有99行代码的JS流程框架 (一)
- 【腾讯云的1001种玩法】试用腾讯云 Windows Server 2012 R2 镜像的几点经验分享
- 一个只有99行代码的JS流程框架(二)
- 看书的时候如何调试书中简单的C+代码?
- gcForest 集成学习方法的 Python 实现
- 云端架构师养成系列之一:高性能云硬盘入门与实战(视频)
- 云端架构师养成系列之二:云端负载均衡上手与实践
- 微信 PaxosStore:海量数据冷热分级架构
- 使用腾讯云容器服务来构建简单web service
- 使用 plotly 绘制数据图表
- 基于云计算的 CV 移动交互应用研究:头部姿态估计综述(2)
- 使用 trie 树实现简单的中文分词
- 重磅发布!2017年度 DevOps 现状调查报告中文完整版!
- AI 泡沫前,我们怎么办?中美两国人工智能产业发展全面解读
- 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 文档注释
- Netty之WebSocket协议应用开发
- Netty之Protobuf编解码框架
- Netty之MessagePack编解码框架
- Netty编解码框架
- Netty之TCP粘包/拆包
- .NET5.0 Preview 8 开箱教程
- 数组:就移除个元素很难么?
- JavaScript 测试系列实战(二):深层渲染和快照测试
- 真是没想到,Springboot + Flowable 开发工作流会这么简单!
- 字符串:这道题目,使用库函数一行代码搞定
- 数组:总结篇
- 数组:滑动窗口拯救了你
- Gin 学习之 cookie 读写
- Gin 学习之绑定参数
- 实践 | Kubernetes守护进程集之DaemonSet