当前位置:  编程技术>移动开发
本页文章导读:
    ▪怎么配置OpenGL ES的下上文(OpenGL ES2.0官方文档翻译)        如何配置OpenGL ES的上下文(OpenGL ES2.0官方文档翻译)OpenGL ES的每种实现,都会有个方法,来创建渲染图形的上下文,从而可以管理Opengl ES指定的状态。通过放置这些状态到上下文中,这样在.........
    ▪ Launcher有关问题(进入安全模式)        Launcher问题(进入安全模式)在PAD上安装第三方APK,然后重新启动PAD进入安全模式,你安装的这个第三方APK的图标会在安全模式下显示吗?     原文地址:【Android】修改Launcher让图标不显示.........
    ▪ OpenGL ES着色器语言之变量和数据类型(2)(官方文档第四章)       OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)4.5精度和精度修饰符 4.5.1范围和精度         用于存储和展示浮点数、整数变量的范围和精度依赖于数值的源(varying,unifo.........

[1]怎么配置OpenGL ES的下上文(OpenGL ES2.0官方文档翻译)
    来源: 互联网  发布时间: 2014-02-18
如何配置OpenGL ES的上下文(OpenGL ES2.0官方文档翻译)

OpenGL ES的每种实现,都会有个方法,来创建渲染图形的上下文,从而可以管理Opengl ES指定的状态。通过放置这些状态到上下文中,这样在多任务的情况下,就很容易的共享图像的硬件设备,从而互不影响各自的状态。

这一章就是来详解,如何创建和配置IOS中的图形上下文。
一个EAGL上下文就是一个OpenGL ES图形渲染上下文在IOS中的实现。
在你使用Opengl ES的函数之前,你必须初始化EAGLContext对象,并且设置它作为当前上下文。EAGLContext类也为你的应用程序提供了一些方法,这些方法可以使Opengl ES的内容方便的同核心动画进行集成工作。没有这些方法,你的应用程序在协同离屏图像工作时,会被限制很多。
一个线程中的当前上下文是作为Opengl ES函数调用的目标
在IOS应用程序中,每个线程都会维护一个当前上下文。当你的应用程序使用Opengl ES的调用时,线程的上下文就会被那个调用改变。
要设置当前上下文,你可以通过调用EAGLContext类的setCurrentContext:方法。
[EAGLContext setCurrentContext:myContext];
你的应用程序也可以通过EAGLContext类的currentContext方法来获取一个线程的当前上下文。
当你的应用程序设置了一个新的上下文时,EAGL会释放先前的上下文,并且获取新的上下文。
注意:如果你的应用程序需要在同一个线程中转换两个或者更多的上下文时,在设置一个新的上下文作为当前上下文之前,要调用glFlush函数。这样确保先前提交的一些命令可以及时的传递给图像硬件设备。
每个上下文都会指定一个Opengl的版本作为目标
一个EAGLContext对象可以支持Opengl ES1.1和Opengl ES2.0中的任何一个,但是不能同时支持两个。原因归于Opengl ES2.0的设计。Opengl ES 2.0移除了Opengl ES 1.0中所有的处理图像的固定功能流水线(其实也就是对顶点和纹理进行处理的变换引擎)的函数,并且增加了许多新的函数,以便于提供一个更清晰的着色接口。如果你的应用程序在Opengl ES1.1的上下文中尝试调用Opengl ES 2.0的函数,那么结果会是未定义的。
当你的应用程序创建和初始化EAGLContext对象时,可以来决定那种版本的Opengl ES会被支持。创建Opengl ES 2.0上下文时,你的应用程序可以如下初始化:
EAGLContext* myContext = [[EAGLContext alloc]
initWithAPI:kEAGLRenderingAPIOpenGLES2];
如果你的设备不支持相应的Openggl ES的版本,那么initWithAPI:的方法会返回nil。在使用EAGLContext的上下文时,你的应用程序应该测试下,确保上下文是被成功的初始化。
为了支持Opengl ES2.0和Opengl ES1.1的渲染特性,你的应用程序应该首先尝试初始化一个Opengl ES 2.0的渲染上下文。如果返回的对象是nil,那么就应该初始化一个Opengl ES 1.1的上下文来代替。清单2-1 演示了如何去做。
EAGLContext* CreateBestEAGLContext()
  {
     EAGLContext *context;
     context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
     if (context == nil)
     {       context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
     }
     return context;
  }

清单 2-1 在同一个应用程序中支持Opengl ES 1.1和Opengl ES 2.0
一个上下文的API属性表明了上下文支持那个Opengl ES的版本。你的应用程序应该测试上下文的API属性,并且使用它选择正确的渲染路径。通常的做法是为每一个渲染的路径创建一个类。你的应用程序可以在初始化的时候,一次创建一个渲染器并且测试上下文。
一个EAGL的共享组(sharegroup)管理上下文中的Openggl ES对象。
尽管上下文保存了Openggl ES的状态,但是它不能直接管理Opengl ES的对象。相反,Openggl ES对象是通过EAGLSharegroup对象创建和管理的。每一个上下文都包含了一个EAGLSharegroup对象,由它代笔创建对象。
假如两个或者更多的上下文引用到了同样的共享组,一个共享组的优点就会变得很明显,如图表2-1所示。当多个上下文关联到同一个共享组时,被任意一个上下文创建的Opengl ES对象在所有的上下文中都是可用的。假如你创建了一个对象,而把这个相同的对象绑定到了另一个上下文中时,你就可以引用同样的对象。在移动设备中,资源是非常匮乏的。在多个上下文中创建同样内容的备份是浪费的。共享通用的资源可以更好的利用设备的图形资源。
你的应用程序会把共享组看成一个不透明的对象。也就是你没有方法和属性可以调用,并且它都是通过引用的上下文自动的retain和release的。
 


           图 2-1 两个上下文共享一个Opengl ES对象
共享组最有用的是以下两种情况:
在不同的上下文中,共享的资源不会变化
当你想要应用程序在一个线程中创建新的Opengl ES对象,而在主线程渲染时。在这种情况下,第二个上下文运行在一个独立的线程中,并且致力于获取数据和创建资源。在所有的资源都加载完成后,第一个上下文绑定到这些对象上,然后立即使用它。
创建多个上下文引用到同一个共享组的方法,首先第一个上下文通过调用initWithAPI:初始化,那么一个共享组就会自动的被创建。然后第二个或者之后的上下文初始化时,就可以通过调用initWithAPI:sharegroup:的方法使用第一个上下文创建的贡献组。清单2-2展示了如何工作。在清单2-1中,第一个上下文通过使用快捷方法。第二个上下文是通过一个扩展的API传递了第一个上下文的共享组从而被创建。
重要:共享同一个共享组的所有的上下文,都必须使用同一个版本的Opengl ES API来初始化上下文。
EAGLContext* firstContext = CreateBestEAGLContext();
EAGLContext* secondContext = [[EAGLContext alloc] initWithAPI:[firstContext API]
sharegroup: [firstContext sharegroup]];
            清单 2-2 用同一个共享组创建2个上下文
当共享组是被多个上下文共享时,你的应用程序就有义务要管理Opengl ES对象状态的改变。规则如下:
当你的应用程序可能要通过多个上下文进入某个对象的同时,要确保对象没有被同时改变。
当对象要被发给上下文的命令改变时,对象此时不能被另外的上下文读取或者改变。
在一个对象被改变时,必须是被绑定对象的所有的上下文才能看到这些改变。如果一个上下文在绑定之前就引用它,那么这个对象的内容是没有被定义的。
这里有一些步骤,是你在更新Opengl ES对象需要遵循的:
1 在每一个可能使用该对象的上下文中调用glFlush方法
2 在某个上下文想要改变对象的同时,调用一个或者更多的Opengl ES的函数来改变对象
3 在接收到上下文状态改变的通知时,调用glFlush函数
4 在每个其他的上下文中,绑定对象的标志。
注意:共享对象的另一个方法是去使用单一的渲染上下文,但是多个目的缓冲帧。在渲染时,你的应用程序绑定需要的缓冲帧,然后渲染成需要的帧。因为所有的Opengl ES对象都是从单一的上下文中渲染的,所以他们看到的是同样的Opengl ES的数据。这个方式使用的资源很少,但是仅仅对单线程的应用程序有用,在单线程中你可以很好的控制上下文的状态。

    
[2] Launcher有关问题(进入安全模式)
    来源: 互联网  发布时间: 2014-02-18
Launcher问题(进入安全模式)

在PAD上安装第三方APK,然后重新启动PAD进入安全模式,你安装的这个第三方APK的图标会在安全模式下显示吗?

 

 

原文地址:【Android】修改Launcher让图标不显示在桌面或者主菜单中作者:MacroCheng

1 如何让程序不显示在桌面上:

(1) 得到该apk的包名,(这个应该很简单)。
(2) 在luancher源码中找到LauncherModel.java,此类中有个方法叫loadAllApps();
for (int i=0; i<N && !mStopped; i++) {
                  // This builds the icon bitmaps.
                  //此处为加入代码
                    ResolveInfo info = apps.get(i);
final ActivityInfo activityInfo = info.activityInfo;
                if("想屏蔽的apk的包名".equals(activityInfo.packageName) ) {
            continue;
          }
                  mAllAppsList.add(new ApplicationInfo(apps.get(i), mIconCache));
                }

注:这样做只是不让图标显示在桌面上,但是此图标的位置是不能使用的,因为该图标还占用着这个位置,如果想让这个图标彻底的不在桌面上,可以调用他自己的removePackage的函数接口。

2 如何让图标不显示在主菜单中:

修改该应用的Manifest文件,找到主activity,去掉
category android:name="android.intent.category.LAUNCHER" 这句。

 


    
[3] OpenGL ES着色器语言之变量和数据类型(2)(官方文档第四章)
    来源: 互联网  发布时间: 2014-02-18
OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)
4.5精度和精度修饰符 4.5.1范围和精度

        用于存储和展示浮点数、整数变量的范围和精度依赖于数值的源(varying,uniform,纹理查找,等等),是不是顶点或者片元着色器,还有其他一些底层实现的细节。最低存储需要通过精度修饰符来声明。典型地,精度操作必须要保留变量包含的精度存储。仅有的例外是需要大量复杂计算的内建函数,如atan(),返回值的精度低于声明的精度。

       强烈建议顶点语言提供一种匹配IEEE单精度浮点数或更高精度的浮点数的浮点范围和精度。这就需要顶点语言提供浮点变量的范围至少是(-2^62,  2^62),精度至少是65536。    

      顶点语言必须提供一种至少16位,加上一个符号位的整数精度。

      片元语言提供与顶点着色器相同的浮点数范围和精度是很有必要的,但不是必须的。这就需要片元语言提供的浮点数的范围至少是(-16384,+16384),精度至少是1024。

      片元语言必须提供一种至少10为,加上一个符号位的整数精度。

     

4.5.2精度修饰符

      任何浮点数或者整数声明前面都可以添加如下精度修饰符:


举例:

lowp float color;

varying mediump vec2 Coord;

lowp ivec2 foo(lowp mat3);

highp mat4 m;

      

         精度修饰符声明了底层实现存储这些变量必须要使用的最小范围和精度。实现可能会使用比要求更大的范围和精度,但绝对不会比要求少。

         一下是精度修饰符要求的最低范围和精度:


        Floating Point Magnitude Range是非零值量级的范围。对于Floating Point Precision,relative意思是任何度量的值的精度都是相对于这个值的。对于所有的精度级别,0必须被精确的表示出来。任何不能提供着色器存储变量所声明的精度的实现都会引起一个编译或链接错误。

        对于高精度和中级精度,整型范围必须可以准确地转化成相应的相同精度修饰符所表示的float型。这样的话,highp int 可以被转换成highp float, mediump int 可以被转换成mediump float,但是lowp int 不能转换成相应的lowp float。

        顶点语言要求编译和链接任何lowp, mediump和highp应用都不能出现错误。

        片元语言要求编译和链接任何lowp, mediump应用都不能出现错误。但是highp支持是可选的。

        字符常量和布尔型没有精度修饰符.当浮点数和整数构造器不含带有精度修饰符的参数时也不需要精度修饰符。

        在这段文档中,操作包含运算符,内建函数和构造器,操作数包含函数参数和构造器参数。

        对于精度没有定义的常量表达式或子表达式,评估的精度结果是所有操作数中的最高精度(mediump或者highp) 。带评估的常量表达式必须是固定不变的,并且在编译期进行。

        另外,对于没有精度修饰符的操作数,精度将来自于其他操作数。如果所有的操作数都没有精度,那么接着看使用计算结果的其他表达式。这个操作是递归的,直到找到一个有精度的操作符为止。如果必要,这个操作也包含赋值运算的左值,初始化声明的变量,函数形参,函数返回值.如果这样依然不能决定精度,如果组成表达式的所有操作数都没有精度,如果结果没有被赋值,也没有当作参数传进函数,那么将使用默认或更大的类型.当这种情况出现在片元着色器中,默认的精度必须被定义.

        比如:

uniform highp float h1;

highp float h2 = 2.3*4.7;操作和结果都是高精度

mediump float m;

m = 3.7*h1*h2;//所有操作都是高精度

h2 = m * h1;//操作是高精度

m = h2 - h1;//操作是高精度

h2 = m + m;//加法和结果都是mediump精度

void f(highp p);

f(3.3);//3.3将作为高精度值传入函数

4.5.3默认精度修饰符

         precision precision-qualifier type;

         precision可以用来确定默认精度修饰符。type可以是int或float或采样器类型,precision-qualifier可以是lowp, mediump, 或者highp。任何其他类型和修饰符都会引起错误。如果type是float类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的浮点数声明(标量,向量,矩阵)。如果type是int类型,那么该精度(precision-qualifier)将适用于所有无精度修饰符的整型数声明(标量,向量)。包括全局变量声明,函数返回值声明,函数参数声明,和本地变量声明等。没有声明精度修饰符的变量将使用和它最近的precision语句中的精度。


         在顶点语言中有如下预定义的全局默认精度语句:

precision highp float;

precision highp int;

precision lowp sampler2D;

precision lowp samplerCube;


         在片元语言中有如下预定义的全局默认精度语句:

precision mediump int;

precision lowp sampler2D;

precision lowp samplerCube;

         片元语言没有默认的浮点数精度修饰符。因此,对于浮点数,浮点数向量和矩阵变量声明,要么声明必须包含一个精度修饰符,要不默认的精度修饰符在之前已经被声明过了。


4.5.4可用的精度修饰符

        内建宏GL_FRAGMENT_PRECISION_HIGH在支持highp精度的片元语言中是定义过的,但在不支持的系统中是未定义的。一旦定义以后,在顶点和片元语言中都可以使用。

                 #defien GL_FRAGMENT_PRECISION_HIGH 1;


4.6变异和invariant修饰符

        在这部分中,变异是指在不同的着色器中的相同语句返回不同的值的可能性.举个例子,两个顶点着色器都使用相同的表达式来设置gl_Position,并且当着色器执行时传进表达式的值也是一样的.完全有可能,由于两个着色器独立的编译环境,当着色器运行时赋给gl_Position的值不一定会相同.在这个例子中,会引起多路算法的几何对齐问题.

        通常,着色器之间的这种变异是允许的.如果想避免这种变异的发生,变量可以使用invariant来声明.

4.6.1invariant修饰符

        为确保一个特定的输出变量是不变的,可以使用invariant修饰符.它可以修饰之前已经定义过的变量,如:

                  invariant gl_Position;

也可以用在变量的声明当中:

                  invariant varying mediump vec3 Color;

        仅如下变量可以声明为invariant:

(1)顶点着色器中内建的特定输出变量

(2)顶点着色器中输出varying变量

(3)片元着色器中特定的输入变量

(4)片元着色器中的输入varying变量

(5)片元着色器中内建的输出变量

          invariant后面还可以跟一个用逗号隔开的之前声明的标识符列表.

          为了确保两个着色器中特定的输出变量不发生变异.还应遵循以下规则:

(1)顶点和片元着色器中的输出变量都声明为invariant

(2)相同的值必须输入到赋给输出变量的表达式或控制流的所有着色器输入变量.

(3)输出变量上的任何纹理函数调用在使用纹理格式,纹理像素值和纹理过滤时都需要设置成相同的方式.

(4)所有的输入变量都以相同的方式操作.


       初始时,默认的所有输出变量被允许变异.如果想强制所有输出变量都不可变,那么在着色器所有的变量声明之前使用

                   #pragma STDGL invariant(all)

4.6.2着色器中的不变体

        当一个值被存到一个变量中,我们通常假设它是一个常量,除非显示的去更改它的值.然而,在优化处理期间,编译期可能会重新计算一个值而不是将它存到寄存器中.因为操作的精度没有被完全指定(如,低精度的操作会被转成中等精度或高精度),重新计算的值有可能就和原来的值不一致.

        在着色器中变体是允许的.如果要避免变体,可以使用invariant修饰符或invariant pragma.

precision mediump;

vec4 col;

vec2 a = ...;

........

col = texture2D(tex, a);//此时a的值假设为a1

..............

col = texture2D(tex, a);//此时a的值假设为a2,但是有可能a1不等于a2

如果强制成常量,可以使用:

                   #pragma STDGL invariant(all)


例子二:

vec2 m = ...;

vec2 n = ...;

vec2 a = m + n;

vec2 b = m + n;//没法保证a和b完全相等


4.6.3常量表达式的不变体

        常量表达式必须要保证是不变体.一个特定的表达式在相同的还是不同的着色器中都必须有相同的结果.这包括同一个表达式出现在同一个顶点和片元着色器中,或出现在不同的顶点和片元着色器中.

        如果满足以下条件,常量表达式必须得出相同的值:

(1)表达式的输入值相同

(2)执行的操作相同并且顺序也相同

(3)所有操作均以相同的精度执行

4.6.4不变体和链接装置

        在顶点和片元着色器中声明的不变体varying变量必须要匹配.对于内建的特定变量,当且仅当gl_Position被声明为invariant时,gl_FragCoord才可以被声明为invariant.同样的,当且仅当gl_PositionSize被声明为invariant时,gl_PointCoord才可以被声明为invariant.将gl_FrontFacing声明为invariant是错误的.gl_FrontFacing的不变体和gl_Position的不变体是一样的.


4.7修饰顺序

        当需要使用多个修饰时,它们必须遵循严格的顺序:


(1)invariant-qualifier   storage-qualifier   precision-qualifier

(2)storage-qualifier    parameter-qualifier    precision-qualifier





















    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3