在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表示绘制点。
更多相关阅读: