笔谈OpenGL ES(二)
昨晚回家也看了OpenGL ES 2.0 iOS教程的第一篇,对于其中涉及的一些基本知识罗列下,虽然自己做iOS开发一年多了,但是对于一些细节没有注意,真正的把自己当成“应用”工程师了 ,不仅要会用,也需要深入的理解,这样进步的才快,所以是需要经常做笔记的。
[OpenGL ES 01]OpenGL ES之初体验 中提到了 + (Class)layerClass 方法,来看看这玩意到底有什么用。
@interface OpenGLView : UIView 中 OpenGLView 继承于 UIView 类,所以可以访问到 UIView 类的成员变量和方法。UIView 类中有个 layer 属性,用来返回主 CALayer 实例,UIView 类中+ (Class)layerClass 方法,可以返回主 layer 所使用的类。进入iOS SDK 中的 UIKit.h中查看 UIView 类
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace>
@property(nonatomic,readonly,retain) CALayer *layer; // returns view's layer. Will always return a non-nil value. view is layer's delegate
+ (Class)layerClass; // default is [CALayer class]. Used when creating the underlying layer for the view.
重写+ (Class)layerClass 方法可以来让UIView使用不同的CALayer来显示,所以就有了
+ (Class)layerClass {
// 只有 [CAEAGLLayer class] 类型的 layer 才支持在其上描绘 OpenGL 内容。
return [CAEAGLLayer class];
}
使用 CAEAGLLAYER 类型的 layer 进行内容的绘制。
用 CALayer 进行图形绘制的时候,常用到其背景色 @property CGColorRef backgroundColor
/* The background color of the layer. Default value is nil. Colors
* created from tiled patterns are supported. Animatable. */
@property CGColorRef backgroundColor;
CALayer 的背景色的设置与UIView 的背景色设置的方式为
yellowLayer = [[CALayer alloc] init];
yellowLayer.backgroundColor = [UIColor yellowColor].CGColor; // CALayer 的背景色设置
blackView = [[UIView alloc] init];
blackView.backgroundColor = [UIColor yellowColor]; // UIView 的背景色设置
这里顺便提一下 UIColor,有的小公司的笔试题神经病啊,问 UIColor 是不是对象?呵呵,UIColor 的声明为
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIColor : NSObject <NSSecureCoding, NSCopying> {
@private
}
UIColor类方法有很多,列举一个看下就行了,
// Convenience methods for creating autoreleased colors
+ (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha;
关于更多 UIView 与 CALayer 之间的关联可以看下这篇文章UIView与CALayer的区别,很详细
还有一个有意思的值得研究的地方,就是指针类型之间的强转,父类指针强转为子类指针、子类指针强转为父类指针,这里面涉及的东西就很有意思了,更多的时候,知道是那么回事,但为什么就要那么做,什么原理?去腾讯面试过iOS工程师,被问及很多原理层面的东西,不求甚解这种做法是弊端很多的,摆在眼前的是,那肯定是进不了牛X的互联网公司的。
- (void)setupLayer
{
_eaglLayer = (CAEAGLLayer*) self.layer; // CALayer 默认是透明的,必须将它设为不透明才能让其可见
_eaglLayer.opaque = YES; // 设置描绘属性,在这里设置不维持渲染内容以及颜色格式为 RGBA8
_eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
}
这里 _eaglLayer = (CAEAGLLayer*) self.layer; 转化的依据是什么?这就跟指针与内存分配扯上关系了。
- (void)layoutSubviews {
[self setupLayer];
[self setupContext]; [self destoryRenderAndFrameBuffer];
[self setupRenderBuffer];
[self setupFrameBuffer]; [self render];
}
layoutSubviews 会在什么时候触发?具体可以看下 解析LayoutSubviews
OpenGL ES 2.0 iOS教程 中引用了OpenGL ES 2.0 for iPhone 、 OpenGL ES 2.0 Programming Guide ,虽然我研究生毕业,也是科班出身,但是看中文肯定比看英文效率高嘛,还是到网上搜搜看看有没有中文版的,还真有。感谢有奉献精神的程序员们,这2篇英文文档对应的中文版为:OpenGL ES2.0 – Iphone开发指引、OpenGL ES 2.0 Programming Guide 编程指南 中文版 。所以,我可不能浪费了这干货了。
还有一篇值得看,网友在学习《OpenGL ES Profile Specification 2.0.24 (Difference Specification) (April 1, 2009) (Annotated)》的过程中提取出来了其中的一些内容,是中文哦。CSDN下载地址:OpenGL ES 2.0规范(中文版),为防止资源失效,我把它存到了百度网盘:http://pan.baidu.com/s/1mgCCdUK
笔谈OpenGL ES(二)的更多相关文章
- Android OpenGL ES(二)----平滑着色
直线或者三角形上的每个片段混合后的颜色可以用一个varying生成.我们不仅能混合颜色,还可以给varying传递任何值,OpenGL会选择属于那条直线的两个值,或者属于那个三角形的三个值,并平滑地在 ...
- 笔谈OpenGL ES(三)
昨天下午以及今天一天,公司安排了新员工培训课程,占用了自己的一些时间,但是也了解到一些新的有利于自身的东西.进公司就要进有完善公司体系和制度的公司,小公司真的是没搞头的,我体验过,反正小公司以后是不会 ...
- 笔谈OpenGL ES(一)
现在图形类.视频类app越来越多,学习OpenGL ES是很有必要的,作为程序员是有必要做技术积累的.现在做播放器开发的工作,正好也涉及这块,那就好好学一学. CSDN上有套教程不错,OpenGL E ...
- OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)
OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,unifo ...
- Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形.但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三 ...
- Android OpenGL ES 开发(二): OpenGL ES 环境搭建
零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...
- OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型
OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型 目录 背景介绍 请参考前文OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 优化 ledCha ...
- OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...
- 在Android中使用OpenGL ES进行开发第(二)节:定义图形
一.前期基础知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGLES绘制2D ...
随机推荐
- redis之 主从复制和哨兵
一.Redis主从复制 主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性 1. 主从复制的相关操作 a,配置主从复制方式一.新增redis6380.conf, ...
- -bash: /bin/grep: Argument list too long和 find: Arguments to -type should contain only one letter报错处理
由于要查找的文件太多 过滤成只找具体时间一天以内的文件 | 查找最近30分钟修改的当前目录下的.php文件 查找最近24小时修改的当前目录下的.php文件 查找最近24小时修改的当前目录下的.php文 ...
- android -------- GifImageView 之gif图片加载
目前支持Gif播放的开源库还是有的,试了一下还是这种好用点,所以来分享下android-gif-drawable是通过JNI来渲染帧的,这种方式比使用WebView或者Movie效率要高 要求Andr ...
- 利用lsof命令查找已经删除的文件来释放磁盘空间
测试环境一台服务器/目录空间使用率达到97%,但是通过du -sh *发现实际空间没用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh *发现共实际使 ...
- [转]npm安装教程
原文地址:https://www.cnblogs.com/lgx5/p/10732016.html 一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpa ...
- linux设置sudo不要密码
linux下,普通用户,sudo时需要密码 改成没密码, vi /etc/sudoers 在 root ALL=(ALL) ALL后加一行 sysusr ALL=(ALL) NOPASSWD: ALL ...
- iOS - 点击UIButton不变灰,button的image不变灰
要想让uibutton点击不变灰 初始化的时候就不能 UIButton *button = [[UIButton alloc]init]; 初始化的时候酱紫,可以保证button点击时不变灰 UIBu ...
- Spring MVC -- JSP标准标签库(JSTL)
JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能.JSTL支持通用的.结构化的任务,比如迭 ...
- sigaction和实时信号sigqueue
sigaction函数sigaction函数的功能是用于改变进程接收到特定信号后的行为.int sigaction(int signum, const struct sigaction *act,st ...
- js 类型判断