OpenGL ES for Android(安卓)绘制线
16lz
2021-12-04
在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相比多了一个最后一个点和第一个点的连线。
效果图如下:
往期推荐
- OpenGL ES for Android 总览
- OpenGL ES for Android 绘制纹理
更多相关文章
- AndroidUi(1)-直线
- Android(安卓)字体颜色渐变效果 Span实现
- android之sql例子
- android之sql例子
- android之sql例子
- Android实现书籍翻页效果--扩展版
- Android实现书籍翻页效果--扩展版(转)
- Android(安卓)OpenGL入门
- Android学习札记15:对Android中View绘制流程的一些理解