OpenGL ES for Android 绘制一个点_第1张图片

 

 

在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表示绘制点。

更多相关阅读:

  • OpenGL ES for Android

  • OpenGL ES 环境搭建

  • OpenGL ES 绘制纹理

  • OpenGL ES 纹理过滤模式-glTexParameteri

更多相关文章

  1. Android,关于设备独立像素(dip/dp),关于机型屏幕适配
  2. 亲测可用Android原生代码添加系统服务
  3. Android界面设计的4种方式之二——在Java代码中控制UI界面
  4. Android10.0 系统解析(02)——搭建Android源代码编译调试环境
  5. 移动开发者最爱的9个优秀Android代码编辑器
  6. Android像素单位
  7. Eclipse与Android源码中ProGuard工具的使用(代码混淆)
  8. Anroid-vlc开源播放器代码编译及简单调用手把手

随机推荐

  1. Android开发实战二之Hello Android实例
  2. android init 进程分析 (1 简介)
  3. Android(安卓)Telephony框架结构简析
  4. android shape
  5. Android中实现全屏、无标题栏的两种办法(
  6. Android夸进程通信机制七:使用 Socket进行
  7. Android中Activity启动模式详解
  8. Android应用程序结构
  9. 再次研究Android(安卓)MediaPlayer
  10. Android(安卓)RelativeLayout 属性