最近将opengl入门篇再复现了下。主要侧重于理论,计算机图形网上有免费大学视频课程。
一,CG理论学习
关于理论的学习主要补充学习了2点
1. 图形和图像的区别
答:一个侧重形状(vertex),一个侧重图像(像素/栅格显示)
2. 计算机图形学/计算机视觉/数字图像处理,三门课程有什么区别
答:他们的处理流程不同。
第一个是CG,就是我当前学习的,从输入:三维模型->处理:绘制(rendering)->输出:二维
第二个是CV,典型代表为三维重建,和我之前学习的视觉slam通过二维图像转为点云再生成三维模型类似,从输入:二维图形->处理:分析处理->三维信息
第三个是DIP,典型代表就是图像处理,比如opencv图像处理,也是我之前学习过的,从输入:二维图像->处理:分析处理->其它信息或某种特效。
理论学习学习,思路也清晰多了。关于CG中看了个布落下的动画,这有物理特效,渲染的不错。另外一个是在box中的物体反射,包括了多种反射的颜色叠加效果,之前没想到那么复杂,还要关注其他物体对本身的反射。
. 光线反射
基本光照模型中有三种反射方式:环境反射、慢反射、镜面反射。
之前我再看镜面反射shader代码的时候,它使用了光线的负方向。而反射的时候使用的是光线的正方向。我之前的理解是错误的,我认为总有一个是会大于90度的。而我看到cos角度最后会和0比较,那么总是会取得一个0呀!
原来我之前一直理解的光线方向是入射方向,其实慢反射指的是反射方向点成法线向量。而镜面反射用的眼睛视角方向与反射方向,所以需要点成一个负方向。如下就是说明view和镜面反射向量方向相反。cos0度的时候为最大值,代码视角和镜面反射重叠的时候,最亮,影响最大。

二,实践学习
把之前学习的代码又复习了一遍。然后开始mesh模型相关教程。
由于教程中使用的assImp库来读取obj,但是我通过github无法下载,我直接使用tinyobj添加自己模型。
遇到的问题
- draw方法错误
一开始我用了index buffer,因为我之前了解obj格式中face中引用的就是v中的index。原来tinybox解析出来的数据是按face中的index整理连接成一个整体,所以能看到重复的数据。 - 关于obj中vertex归一化的问题
之前我的vulkan中导入模型的时候没有注意,我用类似代码去处理obj,错误显示不正确,于是我从另外一个example中查看,发现了过了数据归一化的算法。后来对比了下obj,原来我用的代码的obj中数据已经是归一化的了。而我当前新下载的obj是没有归一化的,所以需要处理。 - 关于mtl材质
这个简单看了下,暂时没有使用,原因是tinyobj不支持,也不是我当前学习的重点,之后继续。材质现在就由我来给他自定义。
这么一折腾,我把obj的属性都搞的一清二楚了,之前只知道v,vn,vt关于f及o和s等都没关注。也只有把输入数据格式及其API的内容搞明白,才可以灵活运行这些数据。
三,最终效果
和我上一篇blog的内容处了verter不同,因为数据来自obj模型,其它shader都一样,只有金属反光大,木材没有反光。
