当前位置:首页 » 安卓系统 » androidopengl20

androidopengl20

发布时间: 2025-06-15 16:38:48

⑴ Android音视频之使用OpenGL ES绘制图片

关于 OpenGL ES 的介绍,请先看上篇: Android 音视频之使用 OpenGL ES 绘制三角形 。

使用 OpenGL ES 绘制简单的几何形状还不够,OpenGL 更多地是用来显示而纹理图像,比如本地图片、相机画面。简单说,纹理(texture)就是一个图像或照片,它们可以被加载进 OpenGL 中。

OpenGL 中的纹理可以扰判用来表示图像、照片等,每个二维的纹理都由许多小缓缺改的纹理元素组成,它们是小块的数据,类似片段和像素。要使用纹理,最常用的方式是直接从一个图像文件加载数据。

纹理不会被直接绘制,它们要被绑定到纹理单元,然后把这些纹理单元传递给着色器。纹理映射的基本思想就是:首先为图元中的每个顶点指定恰当的纹理坐标,然后通过纹理坐标在纹理图中可以确定选中的纹理区域,最后将选中纹理区域中的内容根据纹理坐标映射到指定的图元上。

纹理的坐标系和顶点着色器的坐标系是不一样的。纹理坐标用浮点数来表示,范围 [0, 1],左上角坐标为 (0.0, 0.0),右上角坐标为 (1.0, 0.0)。注意:要将纹理坐标对应到正确的顶点上,才能使纹理正确扮银地显示。

定义顶点和纹理坐标,两者的顺序必须一一对应。

定义着色器。

加载图片到 OpenGL 中。

计算变换矩阵,采用 CenterInside 或者 CenterCrop 的方式显示。

显示图片。

源码在 GitHub 上。

参考资料:

⑵ 如何查看android系统的openGL版本

android中查看手机系统的OpenGL版本,可以使用如下代码进行查询:

java">ActivityManageram=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfoinfo=am.getDeviceConfigurationInfo();
info.reqGlEsVersion=0x00010001//代表opengles1.1
info.reqGlEsVersion=0x00020000//代表opengles2.0

ActivityManager是Android框架的一个重要部分,它负责一新ActivityThread进程创建,Activity生命周期的维护。ActivityManagerProxy实现了接口IActivitManager,但并不真正实现这些方法,它只是一个代理类,真正动作的执行为Stub类ActivityManagerService,ActivityManagerService对象只有一个并存在于system_process进程中,ActivityManagerService继承于ActivityManagerNative存根类。

⑶ 如何在Android上使用OpenGL ES 2.0绘制点

如何在Android使用OpenGL
ES
2.0绘制点,看上去并不是一个复杂的问题,但是上网一搜,满眼都是绘制点的代码。
如果你看到类似如下代码,基本上你已经掉坑里了。
···
c
glBeging();
...
glDrawPoint(...);
...
glEnd();
```
如上是使用OpenGL
ES
1.0绘制点的代码。因为架构不同,在OPENGL
ES
2.0的世界里,这一套已经彻底不管用了。
在OpenGL
ES
2.0里绘制点,要使用Shader,使用Shader,用Shader。。。。。。
具体怎么绘制呢,首先你要搞清楚,如何用Shader绘制一个普通带颜色的三角形。我这里假设你已经会了。
三角形显示出来的那一刻,你一定会有这样的代码:
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,
0,
vertexCount);
那么,只显示三角形的三个顶点该怎么办,说来简单,这行代码改成
GLES20.glDrawArrays(GLES20.GL_POINTS,
0,
vertexCount);
即可。
但是,理想和现实的差距总是很大,改完后三角形消失了但是顶点没有出现。正常OpenGL
2.0环境下应该怎么做呢?
1)首先调用
GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
这样在Shader中可以访问glPointSize;
2)然后类似准备每个顶点色彩那样准备顶点的大小的数值,三角形是三个顶点,就准备3个float。把顶点数据像色彩数据那样,绑定到VOB,再绑定到Shader的参数中。基本上就是照准备色彩那样准备顶点大小数据,不同之处在于每个色彩4个float,每个顶点尺寸1个float。
3)最后,把你的顶点Shader文件改好,增加顶点大小的输入参数和gl_PointSize赋值。
4)另外,如果你打算显示圆形顶点,而不是方形的,还要用GL20.glEnable()函数设置其他参数,具体可查OpenGL官网。
比如:
uniform
mat4
matrix;
attribute
vec4
aVertex;
attribute
vec4
aColor;
attribute
float
aPointSize;
varying
vec4
vColor;
void
main(){
vColor
=
aColor;
gl_Position
=
matrix
*
aVertex;
gl_PointSize
=
aPointSize;
}
这样,基本上就搞定了。
现在,坑爹的问题来了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎认为在手机的3D环境下绘制点没多大必要性,所以并没有加上这个参数,好在缺省情况下,模拟器中Shader中的gl_PointSize是打开的(Android
4.4.x)。所以你可以跳过第一步,直接传递点大小的参数,并把Shader改好就成。
那么,为什么你不写gl_PointSize
=
aPointSize,点就显示不出来呢。我估计缺省情况下,gl_PointSize
=
0.0f,所以显示不出来。
如果你显示点的大小总是固定不变的,你甚至可以把传递顶点大小数值的步骤也省略掉,直接在Shader中写上gl_PointSize
=
10.0f;即可。
阅读本文,当你打算在Android上用OPENGL
ES
2.0显示点时,即可跳过谷歌的那些坑了。我想,手机GPU硬件厂商的开发包应该对OpenGL
ES
2.0支持的更好些,比如高通的AdrenoSDK,建议大家下载尝试。

热点内容
吉利车的wifi密码是什么 发布:2025-06-16 02:12:19 浏览:529
如何用服务器做软件 发布:2025-06-16 02:02:29 浏览:996
虚幻脚本 发布:2025-06-16 01:58:47 浏览:513
加拿大签证访问目的 发布:2025-06-16 01:57:29 浏览:139
奥维企业服务器图源地址 发布:2025-06-16 01:45:44 浏览:53
云e服务器 发布:2025-06-16 01:42:49 浏览:340
哪咤u透明a柱在哪个配置 发布:2025-06-16 01:34:30 浏览:825
淘宝密码如何找回密码 发布:2025-06-16 01:34:28 浏览:697
脚本错误无效字符 发布:2025-06-16 01:24:39 浏览:387
安卓微信怎么删对话框不删记录 发布:2025-06-16 01:23:56 浏览:250