第十七章 片段着色器:增强像素处理的威力
在本章中,我们将通过带有多种片段着色器的实例来学习,包括每像素光照、颜色变换、图形处理、凹凸贴图和程序纹理。
a) 颜色转换 包括灰度、调棕色、反色、热信号和基于片段的雾。
b) 图像处理 是片段着色器不需要顶点着色器协助的另一个领域。模糊:也许是最为常见的一种过滤器,能够平滑一些高频率的特性。锐化:与模糊正好相反。它的应用包括物体边缘更为清晰以及使文本更容易阅读。膨胀和侵蚀:都属于形态过滤器,即它们都会改变物体的形状。膨胀扩大明亮物体的大小,而侵蚀则缩小明亮物体的大小。边缘检测:对物体的边缘进行检测,边缘就是图像的颜色急剧变化的地方,而边缘检测过滤器就是要找出这些急剧变化的地方,并对它们进行强化。
c) 过程纹理贴图 就是不使用任何纹理的情况下对下一个物体进行纹理贴图,可以跳过纹理加载和纹理查找阶段,直接对纹理进行描述。过程纹理贴图既有优点又有缺点。其中一个优点是它的存储要求很低,只要能够容纳一些着色器指令就可以了。另一个优点是它实际上无限的分辨率。缺点就是如果需要表示的纹理具有相当的复杂性,它会要求一个差不多同样复杂的片段着色器,这也是它并没有被广泛使用的原因。
第十八章 高级缓冲区
讨论OpenGL中的一些最新和最激动人心的特性,包括离屏加速渲染、异步复制像素数据的更快捷方法和纹理与颜色缓冲区的浮点颜色数据。
a) 像素缓冲区对象 是一种新类型的缓冲区对象,PBO允许驱动程序采用一些可以提高性能的快捷方式。包括对经常使用的数据进行缓存,使它们靠近GPU;避免从客户内存存到驱动程序的一次额外复制;允许从帧缓冲区的读取通过管线;数据可以在不显式地从客户内存来回复制的情况下改变用途。
b) 帧缓冲区对象FBO 允许把渲染从窗口的帧缓冲区转移到我们所创建的一个或多个离屏帧缓冲区。离屏只是意味着帧缓冲区的内容不可见,直到它首先被复制会窗口。FBO并不受窗口大小的限制;纹理可以连接到FBO,允许直接渲染到纹理,不需要显式的glCopyTexImage;FBO可以包含多个颜色缓冲区,可以同时从一个片段着色器写入。
c) 浮点纹理: GL_ARB_texture_float扩展允许使用12种新的纹理内部格式。基本颜色格式有6种,并且每种部分为16位和32位浮点格式。高动态范围,可以使用它做任何事情,不在受限于捕捉0.0-1.0范围内的256种色调,而是可以在浮点缓冲区中保存任意的数据。
最近在做一个项目,基于海思的HI3531。ARM cortex A9 双核@MAX 930Mhz。项目要求希望是能有HDMI 、VGA、 DVI、 LAN、UART等接口。要求用4片4G DDR3颗粒;2G的nandflash和128M 的norflash。系统完成后要求能跑基本的linux内核系统。主要的设计应该属于PCBlayout。其中的HDMI 和 DDR3 还有千兆网卡,都是特别需要注意的地方。其中对应电源要求是:1v要求能提供8A的电流,里面有两个自动调整电路。在实际使用中不错;
里面有很多实际设计的问题,不过项目进展相对比较顺利!
在iOS界面这块,要么使用Nib文件、要么就直接写在代码里面了,没有用过storyBoard,一直很好奇,今天看完之后想想还是做个总结吧,很多东西都比较细节。
为什么要用storyBoard?好在哪里?
从用完的感觉上来说,确实方便,能够迅速的建立起各个界面之间的连接关系,跳转什么的,后期修改连接也是很容易的。
但是,从另一个角度出发,storyBoard比较适合小型程序,或者说界面比较少的程序,因为当界面较多时(有很多Tabbar、tableView),storyBoard会比较乱,而且站在团队开发这一点上,需要专门的人去维护storyBoard。
本文并不是storyBoard的教程,也不需要= =,因为网上已经有大神写的很详细的了(自叹不如啊),本文只是小小记录一下笔者在学习storyBoard的时候遇到的一些问题以及解决技巧。
一、 可以不用mainStoryboard而用自定义的吗?
可以的,第一步新建User Interface中的Storyboard,第二步修改info.plist里面的Main storyboard file base name 为自己的storyboard就可以了。
二、 Terminating app due to uncaught exception'NSGenericException', reason: 'Push segues can only be used when the sourcecontroller is managed by an instance of UINavigationController.
这个错误的意思是,在连接两个viewController的时候,使用了“push”的方式,但是源viewController不是UINavigationController的实例,所以异常,程序终止。
解决这个错误有两种方法:
第一个:是在用“Ctrl”连接两个viewcontroller的时候,不要用“push”的方式,而用“modal”的方式。
第二个:就是添加一个UINavigationController咯。
从library中拉出一个到canvas上。
在这一步的时候网上很多地方都没讲清,我就讲细一点。
可以看到拉出来的Navigation Controller还跟着一个Table viewController。如果你的导航不用包含一个tableView的话,直接删掉即可,没问题。
要注意的是现在这个Navigation Controller只是一个导航栏,没有内容(run一下你只能看到导航栏,然后下面是黑的。。)
然后我们添加一个最简单的viewController,然后在NavigationController按住“ctrl”拖动到viewController上,会弹出一个黑色的框。
说明一下这几个选项的作用,push是用导航(navigation)的形式跳转,modal是以模态的形式展现,custom当然就是自定义了,不用深究。
最后Relationship Segue—root view controller才是我们要选择的。
它的意思是把viewController当作根控制器添加到NavigationController中去,跟跳转没半毛钱关系,请注意。。连接之后符号是:
添加完成之后再想怎么跳转都行,只要在viewController里面添加控件便可以了。
注:同理TabBar也是一样的,也是连接RelationshipSegue来填充内容。
三、storyBoard里面的view怎么和viewController联系起来
在Class里面写出需要的viewController的名字就可以了,就可以连接界面上的输出口了(或者整个界面都写在viewDidLoad里面也行呢)。
像这样view就和viewController联系在一起了,整个逻辑立马就通了。首先通过storyBoard编辑好界面和跳转,再通过Class把对应的控制器连接起来,得到输出口和Action的触发事件。
四、怎么设置storyBoard的开始,即起始场景?
也有两种方法
第一个:
注意到这个箭头了吗,这个就是起始的标志,直接拖动想要修改为起始场景的那个viewController就可以了。
第二个:点击一个viewController
勾上Is Initial ViewController就行了。
Ok,搞定,面朝大海,春暖花开。
杨光(atany)原创,转载请注明博主与博文链接,未经博主允许,禁止任何商业用途。
博文地址:http://blog.csdn.net/yang8456211/article/details/13005429
博客地址:http://blog.csdn.net/yang8456211
—— by atany
本文遵循“署名-非商业用途-保持一致”创作公用协议