从别人基础开始敲最差劲游戏引擎三_顶点输入之法线(翻译向)

目录

翻译:法线向量??

有图有真相

入门公式,公式和公式的理解

第六章,还是没有法线,顶点法线

第七章,为什么翻译Vectors

Gourand Shading


1)今天,还是在研究顶点法线

2)此法线非彼法线,不想说法线向量,不过输入关键字:法线,网上的资料都是在说法线向量(你们是有多爱法线向量)

3)以下内容出自《Introduction to 3D Game Programming with DirectX 11》

4)传说中的龙书,感觉是大学的老师都在推这本书(2017年前后有不少老师的中文翻译)

翻译:法线向量??

(法线向量,这个名词到底怎么来的),看完第7章我悟了

略懂中文的应该都觉得有语法错误(Title 是法线向量,第一句就是表面法线,后面也没说法线向量是个什么东东,而整个第七章节说的都是光线,感觉看死书,却看得懂这个章节的都是天才,千万不要浪费你的才华)

7.2 法线向量

---------------------------------------------------------------------------------------------

一个表面法线 is 一个单位向量,用于描述(一个)polygon(拓扑块)的面向方向(朝向),(例如,平面上所有点的xxx)见图表7.4a ~¥#@%¥#!%¥!^%#*&%*!%^*!!%*&@^*&^*! %^&%!^&%!^&*((^(*^#(*@&*(&$*#@(%&^$%^%$^~#%$#%$@%~$

龙书的7.2这一个章节,一直在说表面向量

人家用英文,用一整个章节其实就在解析的 normal(非法线向量)吗?

人家说的就是normal,并没有什么法线向量

人家说的vector normal 应该是Normal vector,主要是英文的“普通”,和“法线”是同一个单词

所以才给这个章节命名成,Normal Vector,用来区分Normal Case

结果国人就一直说法线向量,法线向量,还要一直钻研法线向量

其实,人家可能只想说的是如何Normalize 矢量(非法线向量)以及如何用

是没错,Normal 在图形学就翻译成法线

有图有真相

入门公式,公式和公式的理解

关于龙书,哥只看了2个章节,

已经是Directx11的书了,前面又D9,D10,这本龙书可是迭代了10几年了,

书中的内容,无论确图片,公式,扩展计算,还是公式推导都很相当出色,和完善

真是经典书籍,但实际开发过程中,真的用不上(因为每年几万的从业人员,倒闭的公司都以千,以万做单位)

很小众的行业,但毕竟这个行业已经存在多年(有增长,有萎缩)

实际开发过程,这个行业已经有太多现成经验了(虽然哥碰到现成的少,分享的也少)

n 这个公式我是真没看懂,但从下面的代码可以推断就是“叉乘”的意思,因为用了XMVector3Cross()

void ComputeNormal(const XMVector3& p0, 
    const XMVector3& p1, 
    const XMVector3& p2, 
    XMVector3& out) 
{ 
    XMVector3 u = p1 - p0; //向量减法运算
    XMVector3 v = p2 - p0; //向量减法运算            
    XMVector3Cross(&out, &u, &v);         //叉乘
    XMVector3Normalize (&out, &out);     //归一化
} 

是不是有点奇怪,怎么一个方法,传两个相同的参数??&out ?? 

XMVector3Normalize (&out, &out);     //归一化

//这TM传2个相同的参数是什么意思?
//有病?
//是的c++有病
//
XMVector3Normalize (&out, &out); 

//我们不得不又把上下文拿出来
//其实上面还有&u,&v
XMVector3Cross(&out, &u, &v); 
XMVector3Normalize (&out, &out);//第一个&out是指针内容做参数传入,第二个&out是传入一个指针,接受返回值


//但问题来了,既然都是指针了,怎么就不直接修改指针内容,进进出出,肯定容易出错啊,内容不安全啊,二义性啊,你这怪程序员不懂C++?不会写程序 ?


 用Unity,C#的写法,其实就是

function ComputeNormal(Vector3 p0,Vector3 p1,Vector3 p2,out Vector3 pNormal)
{
    Vector3 u = p1-p0;
    Vector3 v = p2-p0;
    Vector3 cross = Vector3.Cross(u,v);
    pNormal = cross.Normalize();//忘了,有没这个写法
}

第六章,还是没有法线,顶点法线

不在第7章,而在第六章节,找到了顶点法线

 顺带,还知道了 normal的长度 - 12个字节

 无奈,从书中,找不到.normal的使用方法,只有.color,(甚至.color的方法都没有的,只是有结构体)

而顶点的color,真心不是那么容易“获得”这里不展开说了

只是提一下:.color主要是用作 Flat shading,如下

而我们不搞:Flat Shading,

只会用:Gourand shading(主要用 Normal)练下手,这才是我们今天的主角法线

虽然Gourand Shading太简单,当代渲染图形学绝不会用到,大牛们都不屑提,书中也没有半句(需自己用搜索引擎搜关键字),但这正是我们在研究的顶点,vertex着色器,又能使用normal这个变量(Input),没有比Gourand Shading 更合适入门的了

4: shade(着色):

   Flat shading:通過一個點的顏色來render多邊形的顏色

   Gourand shading: 通過多個點(颜色插值)

   可以通過SetRenderStata(D3DRS_SHADEMODE,,)來設置shade方

第七章,为什么翻译Vectors

第7章主要讲光线。。。。。。

为什么目录里是:Normal Vectors?

还有Computing Normal Vectors,和Transforming Normal Vectors 

重新看了一下,为什么Vectors要用复数?

难道,翻译成”法线向量“原来是完全错误的?

正确翻译,应该是”法线归一化,法线朝向“吗?

当然,很多书都翻译成“向量”,但很多书都把“向量”和“矢量”等价,

“向量”这个词应该是为了翻译修正,和“矢量”区隔

其实下面英文说的明明白白(中国“叫兽”真的不要自作聪明,用简写,用向量,害了多少人?害了几代人?)

其实搞清楚什么是Vectors(向量)

剩下就很容易理解第7章了

7.2 法线朝向
7.2.1 计算法线朝向
7.2.2 法线朝向的各种转换

Gourand Shading

结合龙书的第6,第7章节,和乐乐姐的书

	outa.color = ina.normal * 0.5+float4(1,1,1,1);
	return outa;

	outa.color = ina.normal * 0.5+float4(0.5,0.5,0.5,1);
	return outa;

    outa.color = float4(ina.TextureUV,0,1);
    return outa;

 *注意:因为normal的类型是 float4,所以这是我的将错就错的写法,+ float4()

*最好normal还是用专门的Normal类型(float3),shader就提供法线类型

猜你喜欢

转载自blog.csdn.net/avi9111/article/details/123708049