文档章节

Android中使用opengl的几个注意事项

今日竹石
 今日竹石
发布于 2014/03/13 16:54
字数 735
阅读 972
收藏 2

在Android中使用OpenGL有几个重要但是容易忽视的事项

1. Render Mode

Render的mode可以设为两种模式,一种是自动循环模式,也就是说GL线程以一定的时间间隔自动的循环调用用户实现的onDrawFrame()方法进行一帧一帧的绘制,还有一种的“脏”模式,也就是说当用户需要重绘的时候,主动“拉”这个重绘过程,有点类似于Canvas中的invalidate()

具体的调用方法是在GLSurfaceView中

a.自动模式

setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);

b."脏"模式

.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

当需要重绘时,调用

GLSurfaceView.requestRender()

一般情况下我使用脏模式,这样可以有效降低cpu负载。在N1的测试结果表明,OpenGL真正绘图时一般会占到30%以上的cpu。

2. Dither

Dither又叫抖动,是一种在色彩空间较小的设备上展示较大色彩空间的图像的一种方法。比如在一个RGB_565的设备上展示RGB_888的图像。如果简单的截断位的话,会造成色彩的失真和生硬。dither使用一个矩阵,来调整一个像素周围的像素的值,来使人眼产生错觉,而“模拟”出原来的色彩。缺省情况下GLSurfaceView是RGB——565的surface,所以如果在该surface上直接绘制RGB_888的纹理的话就会产生色彩失真,修复办法就是使能dither。方法很简单

gl.glEnable(GL10.GL_DITHER);

 

3. 深度测试

深度测试是在片断处理过程中通过测试一个片断在eye space的深度坐标,来判断它是否被更小深度坐标的片断遮挡而决定是否真去绘制它。没有深度测试,物体展现与否就会取决于绘制顺序而不是摆放的坐标。

在Android中打开深度测试的方法是

GLSufaceView.setEGLConfigChooser(true);

你甚至可以进一步规范片断处理中每种测试所占的位数:

 mGLView.setEGLConfigChooser(redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize)

 

4.深度坐标的精度

3中已经知道我们可以设置深度缓冲区的位数以达到合理的精度。如果精度不够的话,在“远方”的物体可能出现不希望的重叠。道理显而易见,由于深度坐标是非线性的,越远的地方单位深度坐标对应的实际距离越大。当精度不足时,较短差距的两个物体就会被“截位”到同样的深度坐标而导致深度测试时发生错误。

解决的办法有两个:

1. 不要将投影平截头的远方坐标设的太大,一般不要 far/near < 100 比较合适

2. 扩大深度缓冲区所占的位数,以提高精度。代价就是占用的内存会增大。

一般我首选1方案。

分享到:


© 著作权归作者所有

今日竹石
粉丝 41
博文 227
码字总数 181312
作品 0
朝阳
程序员
私信 提问
Android图形---OpenGL(二)

本文译自:http://developer.android.com/guide/topics/graphics/opengl.html OpenGL 包 一旦使用GLSurfaceView和GLSurfaceView.Renderer类给OpenGL建立了一个View容器,那么就可以开始使用以...

长平狐
2012/10/16
130
0
Android图形---OpenGL(一)

本文译自:http://developer.android.com/guide/topics/graphics/opengl.html Android系统包含了OpenGL(Open Graphics Library),从而给2D和3D图形提供了高性能的支持,尤其是OpenGL ES A...

长平狐
2012/10/16
257
0
图片和图形之用OpenGL ES显示图形(9)

原文 概要 Android框架提供了大量用于创建有吸引力的功能性图形用户界面的标准工具。但是,如果您想要更多地控制应用程序在屏幕上绘制的内容,或者冒险进入三维图形,则需要使用其他工具。A...

lichong951
2018/05/26
0
0
Android Graphic : apk and Skia/OpenGL|ES

Android apk里面的画图分为2D和3D两种:2D是由 Skia 来实现的,也就是我们在框架图上看到的SGL,SGL也会调用部分opengl的内容来实现简单的3D效果;3D部分是由OpenGL|ES实现的,OpenGL|ES是O...

Jerikc
2014/05/27
359
0
Android 使用 OpenGL ES 绘制三角形

1. OpenGL ES 简介 OpenGL 是一个跨平台的图形 API,为 3D 图形处理硬件制定了一个标准软件接口。OpenGL ES 是为嵌入式设备设计的 OpenGL 规范,Android 提供了对 OpenGL ES 的支持。 OpenGL...

落英坠露
05/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
57分钟前
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
4
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部