opengl学科理论及绘制三维obj模型--Apple的学习笔记

最近将opengl入门篇再复现了下。主要侧重于理论,计算机图形网上有免费大学视频课程。

一,CG理论学习

关于理论的学习主要补充学习了2点

1. 图形和图像的区别

答:一个侧重形状(vertex),一个侧重图像(像素/栅格显示)

2. 计算机图形学/计算机视觉/数字图像处理,三门课程有什么区别

答:他们的处理流程不同。
第一个是CG,就是我当前学习的,从输入:三维模型->处理:绘制(rendering)->输出:二维
第二个是CV,典型代表为三维重建,和我之前学习的视觉slam通过二维图像转为点云再生成三维模型类似,从输入:二维图形->处理:分析处理->三维信息
第三个是DIP,典型代表就是图像处理,比如opencv图像处理,也是我之前学习过的,从输入:二维图像->处理:分析处理->其它信息或某种特效。

理论学习学习,思路也清晰多了。关于CG中看了个布落下的动画,这有物理特效,渲染的不错。另外一个是在box中的物体反射,包括了多种反射的颜色叠加效果,之前没想到那么复杂,还要关注其他物体对本身的反射。

. 光线反射

基本光照模型中有三种反射方式:环境反射、慢反射、镜面反射。
之前我再看镜面反射shader代码的时候,它使用了光线的负方向。而反射的时候使用的是光线的正方向。我之前的理解是错误的,我认为总有一个是会大于90度的。而我看到cos角度最后会和0比较,那么总是会取得一个0呀!
原来我之前一直理解的光线方向是入射方向,其实慢反射指的是反射方向点成法线向量。而镜面反射用的眼睛视角方向与反射方向,所以需要点成一个负方向。如下就是说明view和镜面反射向量方向相反。cos0度的时候为最大值,代码视角和镜面反射重叠的时候,最亮,影响最大。


反射理论.png

二,实践学习

把之前学习的代码又复习了一遍。然后开始mesh模型相关教程。
由于教程中使用的assImp库来读取obj,但是我通过github无法下载,我直接使用tinyobj添加自己模型。

遇到的问题

  1. draw方法错误
    一开始我用了index buffer,因为我之前了解obj格式中face中引用的就是v中的index。原来tinybox解析出来的数据是按face中的index整理连接成一个整体,所以能看到重复的数据。
  2. 关于obj中vertex归一化的问题
    之前我的vulkan中导入模型的时候没有注意,我用类似代码去处理obj,错误显示不正确,于是我从另外一个example中查看,发现了过了数据归一化的算法。后来对比了下obj,原来我用的代码的obj中数据已经是归一化的了。而我当前新下载的obj是没有归一化的,所以需要处理。
  3. 关于mtl材质
    这个简单看了下,暂时没有使用,原因是tinyobj不支持,也不是我当前学习的重点,之后继续。材质现在就由我来给他自定义。

这么一折腾,我把obj的属性都搞的一清二楚了,之前只知道v,vn,vt关于f及o和s等都没关注。也只有把输入数据格式及其API的内容搞明白,才可以灵活运行这些数据。

三,最终效果

和我上一篇blog的内容处了verter不同,因为数据来自obj模型,其它shader都一样,只有金属反光大,木材没有反光。


myobj.png

你可能感兴趣的:(opengl学科理论及绘制三维obj模型--Apple的学习笔记)