OpenGL光照学习以及OpenGL4环境

前言

最近稍有空闲,整理下之前学习光照的笔记,以及在配置OpenGL4环境过程中遇到的问题。

光照

1、模拟灯光

模拟灯光:通过GPU来计算场景中的几何图形投射和散发出来的光线。
本质是GPU对每个三角形的顶点单独计算灯光,然后把结果再顶点之间的片元中进行插值。
故而当要求一个更真实、更光滑的灯光时,需要增加大量的三角形,从而加大计算量。
在上述这种情况,可以把灯光效果预处理并烘焙到纹理中。(就是形成一个纹理)

2、光照计算

光源=环境光 + 漫反射光 + 镜面反射光。
在计算光照的过程中,需要注意三角形的材质、三角形的法线、光源的光线;
法向量也是单位向量。
标准化:把向量的长度化为1.0。

3、GLK和光照

与光照相关的GLKBaseEffect属性:

@property (nonatomic, assign) GLKVector4   position;                                                       // { 0.0, 0.0, 0.0, 1.0 }
@property (nonatomic, assign) GLKVector4   ambientColor;                                                   // { 0.0, 0.0, 0.0, 1.0 }
@property (nonatomic, assign) GLKVector4   diffuseColor;                                                   // { 1.0, 1.0, 1.0, 1.0 }
@property (nonatomic, assign) GLKVector4   specularColor;                                                  // { 1.0, 1.0, 1.0, 1.0 }

开启灯光后,GLKBaseEffect的常量颜色以及顶点的颜色都会被忽略
即使设置成灯光关闭,enabled = GL_FALSE ,constantColor仍会被忽略。

求三角形ABC法向量:给出三角形ABC三个顶点的坐标后,通过GLKVector3Subtract可以算出两个向量AB, AC;
通过GLKVector3CrossProduct 求出AB和AC的叉积,并单元化GLKVector3Normalize

4、光照模型

我们在现实生活中看到某一物体的颜色并不是这个物体的真实颜色,而是它所反射(Reflected)的颜色。换句话说,那些不能被物体吸收(Absorb)的颜色(被反射的颜色)就是我们能够感知到的物体的颜色。
这里可以通过vec*vec的方式来计算;

注意三种乘法

  • vec * vec 分量乘 (x1 * x2, y1 * y2, z1 * z2) 向量
  • vec · vec 点乘 x1*x2 + y1*y2 + z1*z2,标量
  • vec X vec 叉乘 (y1 * z2 - z1 * y2 , z1 * x2 - x1 * z2 , x1 * y2 - y1 * x2) 向量

冯氏光照模型(Phong Lighting Model),由3个元素组成:环境光(Ambient)、漫反射光(Diffuse)和镜面光(Specular) ;

高洛德着色(Gouraud Shading)与冯氏着色(Phong Shading)
在图形渲染中有两种着色方式,高洛德着色与冯氏着色。高洛德着色也被称为Per-Vertex着色,它是在顶点着色阶段对顶点进行颜色计算,然后在光栅化阶段对这些顶点颜色进行线性插值形成片元的颜色;冯氏着色也被称为Per-Pixel像素着色,它是在片元着色阶段对每一个片元(像素)进行颜色计算。

逆矩阵(Inverse Matrix)和转置矩阵(Transpose Matrix)
无论何时当我们提交一个不等比缩放(注意:等比缩放不会破坏法线,因为法线的方向没被改变,而法线的长度很容易通过标准化进行修复),法向量就不会再垂直于它们的表面了,这样光照会被扭曲。
修复这个行为的诀窍是使用另一个为法向量专门定制的模型矩阵。这个矩阵称之为正规矩阵(Normal Matrix),它是进行了一点线性代数操作移除了对法向量的错误缩放效果。如果你想知道这个矩阵是如何计算出来的。
正规矩阵被定义为“模型矩阵左上角的逆矩阵的转置矩阵”。

这一段来源是learnopengl

对于着色器来说,逆矩阵也是一种开销比较大的操作,因此,无论何时,在着色器中只要可能就应该尽量避免逆操作,因为它们必须为你场景中的每个顶点进行这样的处理。以学习的目的这样做很好,但是对于一个对于效率有要求的应用来说,在绘制之前,你最好用CPU计算出正规矩阵,然后通过uniform把值传递给着色器(和模型矩阵一样)。

备注:GLK相关的函数如下

GLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool * __nullable isInvertible);

光照总结

光照计算的终极公式
光照颜色 = 发射颜色 + 全局环境颜色 + (环境颜色 + 漫反射颜色 + 镜面反射颜色) × 聚光灯效果 ****× 衰减因子****

终极公式来源

OpenGL4环境搭建

learnopengl-cn上有很多不错的demo,但是在mac运行过程中遇到了各种坑,总结如下。

1、GLFW

如果没有 GLFW,Xcode 创建的项目只能运行 OpenGL 2.1 的版本,而无法使用系统支持的 4.x 版本。
解决方案
环境配置

2、CMake

CMake安装
sudo "/Applications/CMake.app/Contents/bin/cmake-gui" --install=/usr/local/bin

El Capitan 引入Rootless机制,即使加sudo(也就是具有root权限)也无法修改系统级的目录,其中就包括了/usr/bin。
解决方案:

  • 1、更改Rootless机制
csrutil disable

csrutil enable
  • 2、将链接到/usr/bin,改成链接到/usr/local/bin。

3、SOIL

SOIL即Simple OpenGL Image Library,是一个跨平台的支持多个格式图片加载的库,主要作用是加载图片成为OpenGL的texture。
引入过程中一样带有很多坑,解决方案如下:
解决方案

修改图片中的标志,m64改为x86_64

4、glm

glm库是一个C++头文件形式的几何数学库,用于GLSL规范下的图形绘制。
靠谱的解决方案

注意,glm只有头文件。

5、OSX

如果你使用的是Mac OSX系统你还需要加下面这行代码这些配置才能起作用:

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
最后成果

总结

已经配置完成的demo在github,里面OpenGL开头的工程。
最近项目新上了一个手绘礼物的功能,本来打算用OpenGL ES来绘制,后面发现有点大材小用。
下次再单独开一篇介绍下这个有趣的功能。

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

推荐阅读更多精彩内容