OpenGLES笔记五光照和矩阵堆

GLKBaseEffect苹果封装用于简单渲染的类,在官方文档中这样解释:

一个简单的照明和阴影系统,用于基于着色器的OpenGL渲染。

GLKBaseEffect类提供了模拟许多OpenGL ES 1.1照明和着色模型提供的行为的着色器,其中包括材质,光照和纹理。基本效果允许最多三个灯光和两个纹理应用于场景。

在初始化时,您的应用程序首先创建一个兼容的OpenGL或OpenGL ES上下文并使其最新。然后,它分配并初始化一个新的效果对象,配置其属性,并调用其prepareToDraw方法。绑定效果会导致着色器被编译并绑定到当前上下文。基本效应还需要由应用程序提供顶点数据。要提供顶点数据,请创建一个或多个顶点数组对象。对于着色器要求的每个属性,顶点数组对象应该启用该属性并指向存储在顶点缓冲对象中的数据。

在渲染时,应用程序调用效果的prepareToDraw方法来准备效果。然后,它绑定一个顶点数组对象并提交一个或多个绘图命令。

基础效应的照明计算是在眼睛空间坐标中完成的。 light0,light1和light2属性保存基础效果灯光的位置和光点方向。 transform属性包含分配给场景的模型视图矩阵。当光线被分配了新的位置或光点方向时,这些值将立即被当前的模型视图矩阵修改。因此,对模型视图矩阵进行排序并更改为灯光以实现所需的光线定位非常重要。在模型视图矩阵更新后,应设置需要以与场景几何相似的方式转换的光位置。

GLKBaseEffect遵循<GLKNamedEffect>协议,必须要写prepareToDraw,在我们以前写的自定义着色器中就是要设置上下文,绑定一些数据。

GLKBaseEffect一些属性

colorMaterialEnabled

指示在计算灯光与材质的交互时是否使用颜色顶点属性。

如果该值设置为GL_TRUE,则在执行任何照明计算时,将使用顶点数据中提供的颜色属性作为材质的颜色。 如果该值设置为GL_FALSE,则使用存储在材质属性中的颜色来点亮图元。 默认值是GL_FALSE。

lightModelTwoSided

一个布尔值,指示是否为基元的两侧计算光照。

如果值为GL_TRUE并且正在渲染基元的背面,则通过否定基元的表面法线来计算照明值。 如果值为GL_FALSE,则在执行照明计算时忽略基元的朝向。 默认值是GL_FALSE。

将此属性的值设置为GL_TRUE可能会影响性能。 只有在基本原理的任何一边在理论上对相机可见时才使用双面照明。

useConstantColor

一个布尔值,指示是否使用常量颜色。

如果该值设置为GL_TRUE,则存储在constantColor属性中的值将用作每个顶点的颜色值。 如果该值设置为GL_FALSE,则应用程序需要启用GLKVertexAttribColor属性并提供每顶点颜色数据。 默认值是GL_FALSE。

transform

当效果被绑定时,模型视图,投影和纹理变换应用于顶点数据。

modelviewMatrix模型变换矩阵,projectionMatrix投影变换矩阵,分为正投影和透视投影。

light0, light1, light2

最多提供三个灯光,类型是GLKEffectPropertyLight,里面可以设置enabled(是否开启),position(位置),ambientColor(环境色),diffuseColor(漫反色),specularColor(镜面色),spotDirection(点方向)等

lightingType

分为GLKLightingTypePerVertex和GLKLightingTypePerPixel,具体解释还没看懂

lightModelAmbientColor

应用于由效果渲染的所有基元的环境颜色。

material

计算渲染图元的光源值时使用的材质属性。

texture2d0, texture2d1

最多提供两个纹理,GLKEffectPropertyTexture类型,包括开启纹理,纹理名字,纹理目标

constantColor

不提供每顶点颜色数据时使用的常量颜色。

fog

应用于场景的雾特性。

GLKBaseEffect属性很多,没有完全搞懂,常用也就光源,纹理,变换。


矩阵堆栈

typedef struct CF_BRIDGED_TYPE(id) _GLKMatrixStack *GLKMatrixStackRef;

矩阵堆栈的概念和栈的概念一样,栈压的是数据,这里压的是矩阵。

GLKMatrixStackCreate创建一个矩阵堆栈

GLKMatrixStackPush压栈,参数是当前的矩阵堆栈,是将当前最上面的矩阵复制一份,然后压入堆栈中

GLKMatrixStackPop出栈,参数是当前的矩阵堆栈,将最后入栈的矩阵出栈。

GLKMatrixStackGetMatrix4得到最上层的矩阵

堆栈的概念,就像我们复制一样,我们初始化一个基础矩阵,然后需要变换时,入栈,得到矩阵,经过变换后使用,如果下一个模型需要使用就继续压栈,不需要直接出栈,不需要我们创建太多的变量,入栈和出栈的数量需要对应。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容