拓幻图形学工程师教学手册(第六讲)|一字一字敲出OpenGL学习教程

上一讲已经介绍了的OpenGL纹理部分的内容,今天这讲关于OpenGL光照(Lighting)示例代码也都在公司github共有仓了,不知道各位是不是试着跑过,没跑过也不要紧,继续往下听吧,最后总要实践的,讲再多不如自己上手一试。我记得Dr. Lee当初还做了蛮多不错的示例代码,比如旋转的五彩菊花,回头我让他贡献一下他的五彩菊花,放到我们的Github上给大家参考。后期Dr. Lee也将推出一些他自己的教程,这可是来自美国克莱姆森大学的教程,大家不要错过,关注我们微信公众号,一起来学习吧。

  1. 光照(Lighting)
    5.1 基本概念
    跑过“太阳系”工程的同学一定发现,除了上一讲的纹理映射实现将太阳及其行星表面纹理进行实现外,还有一个重点就是光。太阳系中唯一的光源就是太阳,其他行星只是进行光反射等,并且太阳光光源是向四面八方照射的,这个系统我们可以用OpenGL光照来进行模拟。

先来看两张不同的图,一张有光照一张没有,看看区别就知道光照在渲染方面其实还是很重要的。

接下来就是具体的光照内容了。

5.2 表面向量

先引入一个概念叫表面法线,也就是表面上某一点的法向量(Normal Vector),是在该点处与表面垂直的方向。对于平面,其上各点的法向是一样的,统一为这个平面的法向。


以上是计算表面法线向量的方法,不多说。

这是对于平面而言,那么更多时候绘制的不是平面而是曲面,该怎么计算表面法线。

顶点法线(Vertex Normal)是过顶点的一个矢量,在生成曲面时,通常令顶点法线和相邻平面的法线保持等角,这样进行渲染时,会在平面接缝处产生一种平滑过渡的效果。

这样就产生两种计算表面法线的方法:Per-face和Per-vertex:


在OpenGL中使用方法如下:

Per-face:


Per-vertex:

所产生的效果,per-face会对于曲面会产生粗糙分割面的感觉,我们称之为“Flat Shading”,per-vertex则会产生平滑感,称之为“Smooth Shading”。
介绍一个函数glShadeModel函数。用于控制opengl中绘制指定两点间其他点颜色的过渡模式。参数一般为GL_SMOOTH(默认),GL_FLAT。OpenGL默认是将制定的两点颜色进行插值,绘制之间的其他点,如果两点的颜色相同,使用两个参数效果相同,如果两点颜色不同,GL_SMOOTH会出现过渡效果,GL_FLAT 则只是以指定的某一点的单一色绘制其他所有点。看下效果:

GL_FLAT:

GL_SMOOTH:

来看看具体调用和结合Per-face/Per-vertex的效果:


注意这里介绍一下,glEnable( GL_NORMALIZE ),在进行光照计算之前自动单位化法向量。之所以需要自动单位化法向量是因为法向量会受到glScalef的影响,当glScalef将物体的坐标放大k倍时,法向量变为1/k。具体调用如下:

原文地址:https://blog.51cto.com/14528075/2437675

时间: 2025-01-25 08:35:59

拓幻图形学工程师教学手册(第六讲)|一字一字敲出OpenGL学习教程的相关文章

拓幻图形学工程师教学手册(第四讲)|一字一字敲出OpenGL学习教程

上一讲已经介绍了基础的OpenGL知识和绘制方面的内容.示例代码都会在我们公司Github找到.Github请搜索Tillusory可以看到.代码都是有注释的,运行环境是Mac OSX的Xcode.win版本的童鞋可以下下来之后放到VS中跑,环境搭建资料很多,有问题的可私信微信公众号. 纹理映射4.1 基本概念上一讲提到绘制太阳系,那么只是学了上一讲,最多就是画几个球,移动位置,做各种旋转运动等等,这怎么是太阳系.太阳,和各大行星至少要有表面图案吧,那么怎么把这些图案覆盖到球体表面呢? 先来了解

拓幻图形学工程师教学手册(第八讲)|一字一字敲出OpenGL学习教程

上次教程关于光照,这次内容会比较复杂,关于着色器(Shader),GLSL(OpenGL Shading Language).对于初次接触图形学的童鞋,可能比较晦涩.并且用Mac开发的同学注意,本教程中有关Shader内容,环境均为win下VS,但这并不代表Mac不支持Shader,只是需要配置一些环境,Google可以百度一下. 着色器(Shader)6.1 着色器分类还记得第一讲中的管线图吗?有个词叫光栅化,记得吗?在光栅化之前都是对顶点进行变换,顶点光照和投影变换等,这些都是对顶点进行操作

拓幻图形学工程师教学手册(第一讲)|一字一字敲出OpenGL学习教程

动机首先申明,我是拓幻科技图形处理工程师,自己接触OpenGL,图形图像等方面也有六年多了,很多人其实并不了解这方面,也不了解如何系统地去学,我觉得基于我硕士时期的课程和经验给大家.这些资料和经验也得感谢我的老师,来自普渡大学的终生教授迈克 贝利(Mike Bailey). 以此连载OpenGL学习教程,给大家讲解,一起学习一下,不对之处,欢迎大家指出讨论. 所有渲染工作都离不开OpenGL, 着色器(Shader)这些,如果你和我一样对图形处理比较感兴趣的话,可能你和当初的我有着同样的困惑:如

拓幻图形学工程师教学手册(第二讲)|一字一字敲出OpenGL学习教程

上一节我们提到过模型变换时有旋转操作,那么在坐标系中,旋转的方向是怎样呢?比如旋转90度,到底向左是正还是右是正呢?我们可以用右手法则来进行正方向判断:图中所示就是右手坐标系中旋转正方向. 3.3 3D绘制下面到代码讲解.最基础的图形学,总要先画最基础的图形吧,那么现在来看以下代码: 看到glBegin括号里GL_LINE_STRIP了吗?顾名思义,画的是一条连线.glVertex3f是用来绘制顶点,坐标为括号里的值,这里我们画了v0,v1,v2,v3,v4 四个顶点,并将其按照顺序连接成以v0

UI第六讲.UISegmentControl的使用,UISliser的使用,UIImageView的使用,UIControl的作用

一.UISegmentedControl的使用(分段控件) UISegmentedControl是iOS中的分段控件. 每个segment都能被点击,相当于集成了若干个button.通常我们会点击不同的segment来切换不同的view. 示例图: 常用方法: 示例代码: 基本的UISegmentControl的用法,同时通过其addtarget/action方法实点击切换view背景色的效果 效果图:点击UISegmentControl的item,切换背景色 二.UISlider的使用(滑块控

第六讲 map

2.  map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 3.  map的功能 自动建立Key - value的对应.key 和 value可以是任意你需要的类型. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次. 快速插入Key - Value 记录. 快速删除记录 根据Key 修

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器

(笔记)斯坦福机器学习第六讲--朴素贝叶斯

本讲内容 1. Naive Bayes(朴素贝叶斯) 2.Event models(朴素贝叶斯的事件模型) 3.Neural network (神经网络) 4.Support vector machines(支持向量机) 1.朴素贝叶斯 上讲中的垃圾邮件问题有几个需要注意的地方: (1)  一个单词只有出现和不出现两种可能,因此每个特征x只有两个取值 (2) 特征向量x的个数应该等于词典的长度,比如  将该算法一般化: (1) 让 可以取更多的值 此时  服从多项式分布,而不再是伯努利分布.一种

Stanford机器学习---第六讲. 怎样选择机器学习方法、系统

原文见http://blog.csdn.net/abcjennifer/article/details/7797502  添加了一些自己的注释和笔记 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学习系统设计.SVM(Support Vector Machines 支持向量机).聚类.降维.异常检测.大规模机器学习等章节.所有内容均来自Stand