昨晚回家也看了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(二)的更多相关文章

  1. Android OpenGL ES(二)----平滑着色

    直线或者三角形上的每个片段混合后的颜色可以用一个varying生成.我们不仅能混合颜色,还可以给varying传递任何值,OpenGL会选择属于那条直线的两个值,或者属于那个三角形的三个值,并平滑地在 ...

  2. 笔谈OpenGL ES(三)

    昨天下午以及今天一天,公司安排了新员工培训课程,占用了自己的一些时间,但是也了解到一些新的有利于自身的东西.进公司就要进有完善公司体系和制度的公司,小公司真的是没搞头的,我体验过,反正小公司以后是不会 ...

  3. 笔谈OpenGL ES(一)

    现在图形类.视频类app越来越多,学习OpenGL ES是很有必要的,作为程序员是有必要做技术积累的.现在做播放器开发的工作,正好也涉及这块,那就好好学一学. CSDN上有套教程不错,OpenGL E ...

  4. OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)

    OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章) 4.5精度和精度修饰符 4.5.1范围和精度 用于存储和展示浮点数.整数变量的范围和精度依赖于数值的源(varying,unifo ...

  5. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .

    OpenGL ES图形库最终的结果是在二维平面上显示3D物体(常称作模型Model)这是因为目前的打部分显示器还只能显示二维图形.但我们在构造3D模型时必须要有空间现象能力,所有对模型的描述还是使用三 ...

  6. Android OpenGL ES 开发(二): OpenGL ES 环境搭建

    零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...

  7. OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型

    OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型 目录 背景介绍 请参考前文OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 优化 ledCha ...

  8. OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成

    首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...

  9. 在Android中使用OpenGL ES进行开发第(二)节:定义图形

    一.前期基础知识储备笔者计划写三篇文章来详细分析OpenGL ES基础的同时也是入门关键的三个点: ①OpenGL ES是什么?与OpenGL的关系是什么?——概念部分 ②使用OpenGLES绘制2D ...

随机推荐

  1. Reshaper \ VSCode快捷键

    Reshaper 常用快捷键 Alt + F7:查找引用 Ctrl + N:Go To Everything 定位到任何,非常强大 Ctrl + Shift + N:Go To File 定位到文件 ...

  2. (转)Python3的四舍五入round()函数坑爹?不,更科学!

    原文:https://blog.csdn.net/lly1122334/article/details/80596026 Python3的四舍五入round()函数坑爹?不,更科学!Python2中, ...

  3. FactorVAE论文学习-1

    Disentangling by Factorising 我们定义和解决了从变量的独立因素生成的数据的解耦表征的无监督学习问题.我们提出了FactorVAE方法,通过鼓励表征的分布因素化且在维度上独立 ...

  4. spring boot集成mybatis分页插件

    mybatis的分页插件能省事,本章记录的是 spring boot整合mybatis分页插件. 1.引入依赖 <!-- 分页插件pagehelper --> <dependency ...

  5. matlab学习笔记10 一般运算符

    一起来学matlab-matlab学习笔记10 10_1一般运算符 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  6. plsql 引用型变量

    set serveroutput on declare pename emp.ename%type; psal emp.sal%type; begin ; dbms_output.put_line(p ...

  7. pipline脚本k8s版

    def label = "jnlp-slave" podTemplate(label: label, cloud: 'kubernetes',containers: [ conta ...

  8. 高级UI-高级渲染

    在使用了Panit画笔之后,可以对其进行渲染,从而达到更加人性化的方式 渲染分类 按常用渲染方式可以分为以下几种: BimapShader位图的图像渲染器 LinearGradient线性渲染 Rad ...

  9. win10 双网卡设置内网和外网同时访问

    当前环境是内网使用固定ip 用有线连接 外网自动获取使用wifi模块连接wifi cmd窗口下运行route print -4 打印路由信息 首先删除 所有0.0.0.0的路由,也就是默认设置 rou ...

  10. 使用SnowFlake算法生成唯一ID

    转自:https://segmentfault.com/a/1190000007769660 考虑过的方法有 直接用时间戳,或者以此衍生的一系列方法 Mysql自带的uuid 以上两种方法都可以查到就 ...