首页 > 编程知识 正文

如何使用opengl,android opengl贴脸

时间:2023-05-03 21:53:41 阅读:62674 作者:2065

OpenGL ES 3.0学习实践

在安卓平台上,OpenGL ES 3.0从零开始

在安卓平台上,OpenGL ES 3.0呈现单色背景

在安卓平台上,OpenGL ES 3.0绘制点、直线和三角形

在安卓平台上,OpenGL ES 3.0绘制彩色三角形

在安卓平台上,OpenGL ES 3.0从矩形看矩阵和正交投影

安卓平台下的OpenGL ES 3.0着色语言基础知识(上)

安卓平台下的OpenGL ES 3.0着色语言基础知识(下)

android平台上OpenGL ES 3.0实例的顶点属性,顶点数组详细信息

android平台下的OpenGL ES 3.0实例详细解析顶点缓冲区对象(VBO )和顶点阵列对象(VAO )

OpenGL ES 3.0在安卓平台上绘制立方体的几种方法

安卓平台上基于OpenGL ES 3.0的二维纹理贴图显示位图

目录

全新的简单渲染器

定义点坐标

本地内存分配

顶点着色器

片段着色器

编译和加载着色器

视口设置

清除颜色缓冲区

画点

画直线

画三角形

全新的简单渲染器

publicclasssimplerendererimplementsglsurfaceview.renderer

定义点坐标

私有浮动[ ] vertex points=newfloat [ ] {

0.0f、0.5f、0.0f,

-0.5f、-0.5f、0.0f,

0.5f,-0.5f,0.0f

(;

理想的屏幕坐标系定义了下图三角形的三个顶点。

本地内存分配

由于OpenGL作为本地系统库在系统中运行,因此虚拟机必须分配本地内存进行访问。

公共简单渲染器

//为每个浮点型分配占4字节空间的内存空间

vertex buffer=byte buffer.allocatedirect (vertex points.length *4) () ) ) ) ) ) ) ) )。

. order(byteorder.nativeorder ) )

. asFloatBuffer (;

//传递指定的坐标数据

Vertexbuffer.put(Vertexpoints;

Vertexbuffer.position(0;

}

顶点着色器

#版本300 es

layout(location=0) in ve c4v位置;

void main () }

gl_Position=vPosition;

gl_PointSize=10.0;

}

上面顶点着色器的说明:

第一行表示可以不写着色器版本,OpenGL ES 2.0版本。

第二行表示输入属性的数组(名为vPosition的四分量向量),而layout (位置=0)表示此变量的位置为顶点属性0。

第三行表示声明main函数。

第四行表示将vPosition输入属性复制到名为gl_Position的特殊输出变量中。

第五行表示将浮点数据10.0复制到gl_PointSize变量中。

片段着色器

#版本300 es

precision介质浮动;

out vec4 fragColor;

void main () }

fragcolor=VEC4(1.0、1.0、1.0、1.0 );

}

上面的片段着色器说明:

第一行表示可以不写着色器版本,OpenGL ES 2.0版本。

第二行表示声明着色器中浮点变量的默认精度。

第三行表示着色器声明了输出变量fragColor。 这是四个分量的向量。

第五行中的显示表示将颜色值(1.0、1.0、1.0、1.0 )输出到颜色缓冲区。

编译和加载着色器

//*

*编译

*

* @param type顶点着色器:GLES30.GL_VERTEX_SHADER

*片段着色器:GLES30.GL_FRAGMENT_SHADER

* @ param shader代码

* @return

*/

private static int compileShader(int type, String shaderCode) {

//创建一个着色器

final int shaderId = GLES30.glCreateShader(type);

if (shaderId != 0) {

//加载到着色器

GLES30.glShaderSource(shaderId, shaderCode);

//编译着色器

GLES30.glCompileShader(shaderId);

//检测状态

final int[] compileStatus = new int[1];

GLES30.glGetShaderiv(shaderId, GLES30.GL_COMPILE_STATUS, compileStatus, 0);

if (compileStatus[0] == 0) {

String logInfo = GLES30.glGetShaderInfoLog(shaderId);

System.err.println(logInfo);

//创建失败

GLES30.glDeleteShader(shaderId);

return 0;

}

return shaderId;

} else {

//创建失败

return 0;

}

}

链接到着色器

/**

* 链接小程序

*

* @param vertexShaderId 顶点着色器

* @param fragmentShaderId 片段着色器

* @return

*/

public static int linkProgram(int vertexShaderId, int fragmentShaderId) {

final int programId = GLES30.glCreateProgram();

if (programId != 0) {

//将顶点着色器加入到程序

GLES30.glAttachShader(programId, vertexShaderId);

//将片元着色器加入到程序中

GLES30.glAttachShader(programId, fragmentShaderId);

//链接着色器程序

GLES30.glLinkProgram(programId);

final int[] linkStatus = new int[1];

GLES30.glGetProgramiv(programId, GLES30.GL_LINK_STATUS, linkStatus, 0);

if (linkStatus[0] == 0) {

String logInfo = GLES30.glGetProgramInfoLog(programId);

System.err.println(logInfo);

GLES30.glDeleteProgram(programId);

return 0;

}

return programId;

} else {

//创建失败

return 0;

}

}

设置视口

这一步通常在onSurfaceChanged中完成

@Override

public void onSurfaceChanged(GL10 gl, int width, int height) {

GLES30.glViewport(0, 0, width, height);

}

清除颜色缓冲区

GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);

缓冲区将会用GLES30.glClearColor指定的颜色清除,清除的颜色被设置为(0.5f, 0.5f, 0.5f, 0.5f),所以屏幕显示为灰色。

绘制圆点

在public void onDrawFrame(GL10 gl)回调方法中:

//准备坐标数据

GLES30.glVertexAttribPointer(0, 3, GLES30.GL_FLOAT, false, 0, vertexBuffer);

//启用顶点的句柄

GLES30.glEnableVertexAttribArray(0);

//绘制三个点

GLES30.glDrawArrays(GLES30.GL_POINTS, 0, 3);

//禁止顶点数组的句柄

GLES30.glDisableVertexAttribArray(0);

刚才的顶点着色器已经将vPosition变量与输入属性位置0绑定了,顶点着色器中每个属性都由一个无符号整数值唯一标识的位置。

绘制直线

//绘制直线

GLES30.glDrawArrays(GLES30.GL_LINE_STRIP, 0, 2);

GLES30.glLineWidth(10);

绘制如图所示:

绘制三角形

//绘制三角形

GLES30.glDrawArrays(GLES30.GL_TRIANGLES, 0, 2);

常用图元类型

图元类型

描述

GL_POINTS

点精灵图元,对指定的每个顶点进行绘制。

GL_LINES

绘制一系列不相连的线段。

GL_LINE_STRIP

绘制一系列相连的线段。

GL_LINE_LOOP

绘制一系列相连的线段,首尾相连。

GL_TRIANGLES

绘制一系列单独的三角形。

GL_TRIANGLE_STRIP

绘制一系列相互连接的三角形。

GL_TRIANGLE_FAN

绘制一系列相互连接的三角形。

直线图元类型:

三角形图元类型

项目地址:

https://github.com/byhook/opengles4android

参考:

《OpenGL ES 3.0 编程指南第2版》

《OpenGL ES应用开发实践指南Android卷》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。