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. Interop with Native Libraries

    http://www.mono-project.com/docs/advanced/pinvoke/

  2. python Windows下的android设备截图工具

    目录 界面版 命令行版 界面版 利用python的wx库写个ui界面,用来把android设备的截图输出到电脑屏幕,前提需要安装adb,涉及到的python库也要安装.代码如下: #!/usr/bin ...

  3. Gdb调试多进程程序

    Gdb调试多进程程序 程序经常使用fork/exec创建多进程程序.多进程程序有自己独立的地址空间,这是多进程调试首要注意的地方.Gdb功能强大,对调试多线程提供很多支持. 方法1:调试多进程最土的办 ...

  4. 即时搜索或input实时检测监听输入框变化

    js实现的文本框内容发生改变立马触发事件简单介绍:本章节介绍一下如何在文本框的内容发生变化的时候,立马触发一个事件执行响应的操作,而不是像是keydow或者keyup事件一样,只能够检测通过键盘输入导 ...

  5. Canvas绘制渐变

    1.绘制线性渐变 Canvas提供了用于创建线性渐变的函数createLinearGradient(x0,y0,x1,y1),坐标点(x0,y0)是起点 ,(x1,y1)是终点 创建一个渐变色 var ...

  6. Zookeeper的安装和使用

    首先在Zookeeper官网下载最新版本,下载后解压到用户目录下. tar -zxvf zookeeper-3.4.8.tar.gz 重命名conf目录下zoo_sample.cfg文件为zoo.cf ...

  7. PHP 图片上传

    PHP上传的简单案例: Html文件: <html> <form action="index.php" name="form" method= ...

  8. mahout 安装测试

    1 下载 在http://archive.apache.org/dist/mahout下载相应版本的mahout 版本,获取官网查看http://mahout.apache.org 相关的信息

  9. CSS百分比定义高度的冷知识

    当我们给块级元素设置响应式高度的时候,例如给div设置height=50%,往往没能看到效果. 原因是百分比的大小是相对其父级元素宽高的大小,如最外层元素设置的百分比是对应屏幕而言的. 需要了解的是对 ...

  10. 【译文】 GC 安全点 和安全区域

    原文链接 : here 根引用  Root references  一个实例死了,意味着它变得无用.只用程序员知道一个实例是否已经无用.为了让程序知道一个实例是否已经无用,我们可以使用编译器分析,引用 ...