1.点乘几何意义?
>0,a,b同向,=1时,方向完全相同
=0,垂直
<0,反向,=-1时,方向完全相反

2.叉乘几何意义?叉乘得到的向量的方向怎么确定?
aXb ,可以得到 同时垂直于a向量,和b向量的向量

而n的方向,是由右手法则决定的。 即伸出右手,四个手指方向从u绕到v. 此时,大姆指的方向,就是n的方向。
若给定两个向量的坐标
a=(a1,b1,c1)
b=(a2,b2,c2)
则向量a×向量b=(b1c2-c1b2,c1a2-a1c2,a1b2-b1a2)

3.矩阵的逆的几何意义?
用于”撤销“变换
eg:比如旋转了,想反悔了怎么办?
(VM)M~1 = V(MM~1) = VI = V
作了一个变换,想撤销,就再乘以变换的矩阵逆,得到一个单位矩阵,原矩阵乘以单位矩阵还是原矩阵

4.谈谈你对矩阵的理解?
矩阵其实本质就是数学公式,对数据进行计算,得到变换后的结果
比如说:平移矩阵,缩放矩阵,旋转矩阵,投影矩阵
(x,y) 用 平移矩阵 变换后,变成了 (x+dx ,y +dy),加上了一个平移的偏移量
(x,y) 用 缩放矩阵 变换后,变成了 scale*(x,y) , 缩放了 scale 倍
(x,y) 用 旋转矩阵 变换后, 变成了 (x’,y’) ,这是一个旋转之后的点

你完全可以 把 这些矩阵当做一个 黑盒子,不需要关注矩阵内部的实现,只需要转入参数,
就会得到 变换之后的数据。
事实上,在一些引擎和数学库中,就是这么做的。
只需要简单的调用API就可以了。
但是,鉴于是学习,简单的 底层是怎么实现的还是要了解的。
因为涉及到很多数学知识,复习一下还是很有必要的。
待真了理解了底层是怎么实现的,那时候,为了提高工作效率,
就可以开心的调引擎提供给我们的API了。
下面,试着推倒一下旋转矩阵,从2D开始

3D的话:
绕x轴旋转:x轴是不变的,在yz平面变换
所以:(x,y,z)*
| 1, 0, 0 |
| 0,cos(a), sin(a) |
| 0, -sin(a),cos(a) |

同理:
绕y轴旋转:
(x,y,z)*
|cos(a), 0 , sin(a) |
|0, 1 , 0 |
|-sin(a) ,0, cos(a)|

绕z轴旋转:
(x,y,z) *
|coa(a),sin(a),0 |
|-sin(a),cos(a),0|
|0, 0, 1|

5.不用reflect函数,怎么求一个向量的反射向量,推倒一下
已知:I(入射向量),N(法向量)

6.光照模型
lambert:环境光(ambient)+方向光的漫反射(diffuse)

phong:环境光+方向光的漫反射+镜面反射(specular)

1. I = -L
R = reflect(I,N)
用dot(R,V)来反映高光的强度

2. 不用CG的reflect函数
R = 2(L * dot(L,N)) – L
用dot(R,V)来反映高光的强度

blinn-phong:
和传统的phong模型相比,渲染效果有时比phong高光更柔和,更光滑,此外,它在速度上相当快(因为不用计算反射向量了),成为许多CG软件的默认渲染方法。
在OpenGL,D3d中,Blinn-phong 就是默认的渲染模型

H:半角向量
H = normalized(V) + normalized(L)
H = normalized(H)
用dot(H,N) 来反映高光的强度

7.渲染管线
不想用书上的流程图。用自己的理解来把它串起来。

想一想拍照,在摄像机视椎体中物体,才有可能被你看到。为什么说有可能!
因为,有些物体一部分在视椎体内,一部分在视椎体外,那么在视椎体外的部分将被裁剪。(clip)
还有,后面的物体被前面的物体遮挡的话,你也看不到。(depth test)
看到的这个物体,背面你也看不到。(cull back)
为什么会这样,背后原理是什么?

首先一个物体,有自己的模型坐标空间。(model space)
然后它在一个3D世界中,那么就要有3D坐标空间来描述模型在哪(world space)
然后,这个模型被摄像机照着,所以被你看到了。所以就要有视坐标空间(view space)
投影到屏幕上,那么就要有屏幕坐标空间来描述这些点(screen space)
你要看到它的样子?那么最后一步就是要把这些点全部都画出来(简单的说就是在屏幕上绘制像素)
跟画画一样,最先绘制的肯定会被后面绘制的覆盖。 经depth test之后,被覆盖的像素就不会被绘制。
最后确定在屏幕上填充这个像素是什么颜色呢,那么要先进行 alpha test,alpha blend
最后填充的就是混合后像素,所有的像素组合成了一幅你看到的画面。

前面提到几个名词:
depth test(z test) :深度测试,测试的是什么?这些值从哪里来?
比较深度,深度?就是离摄像机的远近。
从深度缓冲区里来(z buffer),存放深度值的地方

同理:alpha test:比较的是透明度,你能看到透明物体后面的东西,其实你看到的像素是经过混合之后的最终像素。
混合:混合的是什么?就是颜色咯(RGB)
alpha blend:既然要混合,那按照什么样的比重混合(前景色占多少百分比,后景色占多少百分比)?
比如:blend srcAlpha OneMinusSrcAlpha
当然也有一个存放这些值的地方咯,颜色缓冲区(color buffer/pixel buffer),存放RGBA。

8.vertex shader 对于面数少的模型,效果会不好,为什么?怎么解决?
那是因为顶点程序只对几何顶点进行光照处理,顶点数在模型建出来的时候就已经固定了,且是有限的。因为性能,不可能为了更好的效果来提高顶点数
为了使低精度模型也能得到高质量的渲染效果,就必须进行片段程序渲染,对每个像素点进行渲染,现代GPU是完全OK的

9.正弦波
ASin(wx+y)

10.法线贴图
法线贴图是将复杂物体表面的凹凸数据记录到图片的RGB三色通道中。
至于颜色。要看你是世界空间法线还是切线方向的法线图了
平时用的较多的,比如游戏中的法线图都是切线模式的。是蓝紫色为主那种。
世界空间法线图则比较五彩斑斓,黄色红色什么的都会同时出现。
至于什么是法线,凹凸原理简而言之就是利用人的视觉上的错觉来模拟复杂的表面凹凸效果

11.为什么法线贴图偏蓝色?
通常我们所见的法线纹理还是基于原法线信息构建的坐标系来构建出来的。
那种偏蓝色的法线纹理其实就是存储了在每个顶点各自的Tangent Space中,法线的扰动方向。
也就是说,如果一个顶点的法线方向不变,那么在它的Tangent Space中,normal值就是z轴方向,也就是说值为(0, 0, 1)。
但这并不是法线纹理中存储的最终值,因为一个向量每个维度的取值范围在(-1, 1),而纹理每个通道的值范围在(0, 1),
因此我们需要做一个映射,即pixel = (normal + 1) / 2。
这样,之前的法线值(0, 0, 1)实际上对应了法线纹理中RGB的值为(0.5, 0.5, 1),
而这个颜色也就是法线纹理中那大片的蓝色。
这些蓝色实际上说明顶点的大部分法线是和模型本身法线一样的,不需要改变。
(一个模型的法线贴图显示大片蓝色:说人话,就是这个模型比较光滑,没有多少凹凸)
总结一下就是,法线纹理的RGB通道存储了在每个顶点各自的Tangent Space中的法线方向的映射值。

12. tangent space 切线空间
T
B
N

基础知识:Q&A的更多相关文章

  1. Linux基础知识整理

    一.基础知识 1.Linux简介 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件 ...

  2. 基础知识漫谈(2):从设计UI框架开始

    说UI能延展出一丢丢的东西来,光java就有swing,swt/jface乃至javafx等等UI toolkit,在桌面上它们甚至都不是主流,在web端又有canvas.svg等等. 基于这些UI工 ...

  3. linux基础知识与技能2

    3.编辑器vi的使用(vi和vim的联系)什么是编辑器?编辑器就是一款软件,它的主要作用就是用来编辑.譬如编写文件,编写代码.Windows中的常用编辑器,如自带的notepad.比较好用的notep ...

  4. linux基础知识与技能1

    1.隐藏文件与非隐藏文件Linux中:linux中隐藏文件特点是文件名以.开头,跟文件属性无关.在linux中查看隐藏文件用ls -a命令(普通显示ls)2.相对路径与绝对路径什么是路径:路径是用来标 ...

  5. C#基础知识记录一

    C#基础知识记录一 static void Main(string[] args) { #region 合并运算符的使用(合并运算符??) 更多运算符请参考:https://msdn.microsof ...

  6. (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识

    开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...

  7. Bash的基础知识man手册

    Bash的基础知识man手册 由于基于Android类设备的渗透测试都是通过各类终端实现.所以掌握Shell相关操作就显得尤为重要.Bash是一个为GNU计划编写的Unix Shell本文选自基于An ...

  8. python核心编程学习记录之基础知识

    虽然对python的基础知识有所了解,但是为了更深入的学习,要对python的各种经典书籍进行学习 第一章介绍python的优缺点,略过 第二章介绍python起步,第三章介绍python基础,仅记录 ...

  9. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

随机推荐

  1. MyBatis学习总结(一)——MyBatis快速入门

    一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  2. Activiti学习(一) 环境搭建

    原料:Activiti5.4  MyEclipse 10 1.先将activiti文件夹放置myeclipse的安装目录dropins文件夹下2.将activiti文件夹里activiti.link中 ...

  3. Ubuntu 14 中,SecureCRT、SecureFX个性化设置

    [SecureCRT 个性化设置] 打开设置路径:菜单栏 -> Opions -> Global Options -> General -> Default Session - ...

  4. 升级到 PHP-7 遇到的坑 及 经验分享

    注意:上面这张图是QQ群网友分享的,图中提到的“被移除的函数”,call_user_func 和 call_user_func_array 在 PHP-7.0 的正式版中是可用的,也许是当时的 测试版 ...

  5. 一些PHP性能优化汇总

    PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置. # vi /etc/php.ini (1) ...

  6. Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

    当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memc ...

  7. Nginx反向代理+keepalived

    环境两台LB(nginx).两台web(nginx/apache都行) 安装httpd web01 [root@web01 /]# /etc/init.d/iptables stop iptables ...

  8. 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事

    对于Windows记事本: ANSI :GB2312 java中应使用GBK解码 Unicode :有签名的UTF-16LE java中应使用UTF-16解码 Unicode big endian : ...

  9. Java 8之二小坑:stream parallel 和 lamada

    Stream:parallel乱序 Java 8 stream流为处理集合时非常方便.遇到的一个坑是为了提高在多核cpu下的性能,尝试了parallel().数据源是HashSet的,在做分割的时候发 ...

  10. highcharts的引用

    开放 CDN 服务 1.基础的使用(CDN) <script src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"&g ...