GPU编程与CG语言之阳春白雪下里巴人

CG的数据结构

结构体:

<1. 如果结构体的一个成员函数使用了成员变量,则该成员变量要声明在前.

<2.语义类型( Binding Semantics),所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的

<3. 类型转换

类型转换可以是强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。
float a = 1.0;
half b = 2.0;
float c = a+b; //等价于 float c = a + (float)b;


当有类型变量和无类型常量数据进行运算时,该常量数据不做类型转换
float a = 1.0;
float b = a + 2.0; //2.0 为无类型常量数据,编译时作为 float 类型


Cg 语言中对于常量数据可以加上类型后缀,表示该数据的类型
float a = 1.0;
float b = a + 2.0h; //2.0h 为 half 类型常量数据,运算是需要做类型转换  f h x[fixed]
 

14.CG 表达式与控制语句

在Cg中,关系操作符以及下节会讲到的逻辑操作符,都返回bool类型结 果,所以这两种操作符有时也被统一称为boolean operator

float3 a = float4(0.5, 0.0, 1.0); float3 b = float4(0.6, -0.1, 0.9); bool3 c = a<b; 
 
在Cg中,求余操作符%。只能在int类型数据间进行

在Cg中,移位操作符功能和C语言中的一样,也可以作用在向量上,但 是向量类型必须是int类型

在Cg中的swizzle操作符(.)将一个向量的成员取出组成一个新 的向量.:swizzle操作符只能对结构体和向量使用,不能对数组使用

函数的递归调用(recursion)在 Cg语言中是被禁止的。Switch 、case和default在Cg中作为保留关键字存在,但 是它们目前不被任何profile所支持。 

 15.输入\输出与语义绑定 

 Uniform inputs

表示一些与三维渲染有关的离散信息数据,这些数据通常由应用程序传入,并通常不会随着图元信息的变化而变化,如材质对光的 反射信息、运动矩阵等。Uniform 修辞一个参数,表示该参数的值由外部【由用 OpenGL 或者 DirectX 编写的程序】应用程序初始化并传入,不容许声明 一个用 uniform 修辞的局部变量!

eg: uniform float brightness,   uniform float4x4 modleWorldProject 

输入\输出修辞符(in\out\inout) 【模拟c中的值类型应用类型操作】

 in: 修辞一个形参只是用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参值,这是典型的值传递方式

out: 修辞一个形参只是用于输出的,进入函数体时并没有被初始化,这种类型的形参一般是一个函数的运行结果【return】。

 inout: 修辞一个形参既用于输入也用于输出,这是典型的引用传递。

输入\输出修辞符通常和语 义词一起使用,表示顶点着色程序和片段着色程序的输入输出

语义词(Semantic)与语义绑定(Binding Semantics)

语义绑定(binding semantics),指定数据的含义和存放的位置,实际上就是将输入\输出数据和寄存器做一个映射关系(在 OpenGL Cg profiles 中是这样的,但在DirectX-based Cg profiles 中则并没有这种映射关系)。根据输入语义,图形处理器从某个寄存器取数据;然后再将处理好的数据,根据输出语义,放到指定的寄存器.
注意:

语义在内部函数(一个阶段的内部处理函数,和下一个阶段没有数据传递关系)是无效的,被忽略。

输入语义POSITION和输出语义POSITION是有区别的。

顶点 Shader 的输入参数, POSITION做输入语义指应用程序传入的顶点位置, 而做输出参数使用 POSITION 语义就表示要反馈给硬件光栅器的裁剪空间位置,光栅器把 POSITION 当成一个位置信息。虽然两个语义都命名为 POSITION,但却对应着图形流水线上不同的寄存器。
语义的使用方式:

<1. 绑定语义放在函数的参数列表的参数声明后面中

<2. 绑定语义可以放在结构体(struct)的成员变量后面

<3. 绑定语义词可以放在函数声明的后面,表示函数的返回值类型语义

CG标准函数库

数学函数 几何函数 纹理映射函数 偏导函数 调试函数

几何函数:

偏导函数;

1. 函数 ddx 和 ddy 用于求取相邻像素间某属性的差值;
2. 函数 ddx 和 ddy 的输入参数通常是纹理坐标;
3. 函数 ddx 和 ddy 返回相邻像素键的属性差值;
调试函数:

经典光照模型:

漫反射:

朗伯反射体:产生光的漫反射现象的物体表面称为理想漫反射体,也称为朗伯(Lambert)反射体

只有环境光下的朗伯反射体,公式表示某点处漫反射的光强:

兰伯特漫反射模型

漫反射光的光强与入射光的方向和入射点表面法向夹角的余弦成正比,则由此构建Lambert漫反射模型:

能较好的表现粗糙表面的光照现象,eg:石灰粉墙,纸,对于金属材质则表现不出光泽,因为没有考虑表面的镜面反射效果。

综合考虑环境光和方向,则Lambert光照模型可以表示为:

若N为顶点单位法向量,L为顶点指向光源的单位向量(注意是顶点指向光源),则cos@=N*L;

镜面反射与Phong模型:

镜面反射:一个光滑物体被光照射时,可以在某个方向上看到很强的反射光,这是因为在接近镜面反射角的一个区域
内,反射了入射光的全部或绝大部分光强,该现象称为镜面反射。

Phong认为镜面反射的光强与反射光线和视线的夹角相关,提出公式:I是光源强度

反射光方向的公式:
reflect(I,L)   L和R都是从顶点指向光源和反射方向的,2*Cos@ -->【只是长度】   N代表方向。

注意:顶点着色器只对几何顶点进行光照渲染。【如马的面片比较少,渲染比较差,所以需要用片段着色器进行渲染】

Blinn-Phong 光照模型(Blinn-phong 反射模型/phong 修正模型)

对传统 phong 光照模型基础上进行修改提出的。和传统 phong 光照模型相比,Blinn-phong 光照模型混合了 Lambert 的漫射部分和标准的高光,渲染效果有时比 Phong 高光更柔和、更平滑,此外它在速度上相当快,在 OpenGL 和 Direct3D 渲染管线中, Blinn-Phong 就是默认的渲染模型.、

相对于传统的Phong模型: 用N*H取代了V*R

H=(L+V) / |L+V|


.

高级光照模型:

BRDF光照模型:

BRDF:描述了入射光线在非透明物体表面如何进行反射。衡量材质的光学特征和物体表面微平面特征。

入射光以特定方向离开的概率。从物理光学上我们可以将公式理解为: BRDF 函数计算的是“特定反射方向的光强与入射光强的比例。

Bank BRDF 经验模型  计算各向异性。

11.3 简单透明光照模型 

12章 投影纹理映射

投影纹理坐标:

     顶点着色器程序中通过视点矩阵和投影矩阵计算得到的,称作投影纹理坐标。而我们常用的纹理坐标是通过调整纹理和3D建模软件的对应关系而产生的。

应用:纹理实时和空间顶点对应时用到。

优点:实时性,防止纹理扭曲。

同一纹理贴到不同模型【不同的三角面片形状】,插值出来的纹理坐标会产生不同的纹理梯度,最后纹理颜色在三角面的分布也是不一样的。纹理扭曲

齐次纹理坐标:

齐次纹理坐标的出现是为了和三维顶点的齐次坐标相对应,因为本质上,投影纹理坐标是通过三维顶点的齐次坐标计算得到的。

投影纹理映射原理:

根据投影机(视点相机)的位置、投影角度,物体的坐标,求出每个顶点所对应的纹理坐标,然后依据纹理坐标去查询纹理 值”,也就是说,不是将纹理投影到墙上,而是把墙投影到纹理上。

左图是正常的顶点空间转换。 右边是 求投影纹理坐标的流程

NDC(归一化的设备坐标)  [0,1] 需要把投影顶点坐标归一化到[0,1]中

tex2DProj函数与tex2D函数的区别就在于:前者会对齐次纹理坐标除以后 一个分量q,然后再进行纹理检索! 

第 13 章 Shadow Map

ShadowMap是基于深度图的阴影生成算法。

该方法的主要思想是:在第一遍渲染场景时,将场景的深度信息存放在纹理图片上,这个纹理图片称为深度图;然后在第二次渲染场景时,将深度图中的信息 1 lenth【某一顶点与光源的距离】 取出,和当前顶点与光源的距离 2 lenth 做比较,如果 1 lenth 小于 2 lenth ,则说明当前顶点被遮挡处于阴影区,然后在片段着色程序中,将该顶点设置为阴影颜色。 


Depth map 中像素点记录的深度值记为 1 lenth ;然后从视点的出发,计算物体顶点v到光源的距离,记为 2 lenth ;比较 1 lenth 与 2 lenth 的大小,如果lenth2 > lenth1 ,则说明顶点v所对应的 depth texure 上的像素点记录的深度值,并不是v到光源的距离,而是v和光源中间某个点到光源的距离,这意味着“v顶点被 遮挡”。

????????????????depth map

Depth map / texture  和 Shadow texture 的区别:

阴影贴图的英文为 Shadow texture,就是将日常所见的阴影保存为纹理图片;

Depth map保存 的是“从视点到物体顶点的距离,通常称为深度值”。


 

 Shadow map 与 shadow texture 的区别 :

 shadow map :map有映射和图片两种含义,翻译为”阴影图“。以 depth map 为技术基础,通过比较“光源可见点到光源的深度”和“任何点到光源的深度”来判断点是否被物体遮挡;

shadow texture: 是阴影贴图,将生成的阴影图形作为投影纹理来处理,也就是将一张阴影图投影映射到一个物体上(阴影接收体)。

13.3 Shadow map 原理与实现流程 

 shadow渲染阴影流程::生成 depth map(深度图) 和使用 depth map 进行阴影渲染。 
生成 depth map 的流程为:

1. 以光源所在位置为相机位置,光线发射方向为观察方向进行相机参数设置;

 
2. 将世界视点投影矩阵 worldViewProjMatrix 传入顶点着色程序中,并在
其中计算每个点的投影坐标,投影坐标的 Z 值即为深度值(将 Z 值保存为深 度值只是很多方法中的一种)。在片段 shadow 程序中将深度值进行归一化, 即转化到【0,1】区间。然后将深度值赋给颜色值(Cg 的颜色值范围在0-1 之间)。

---------未完待续

第 14 章 体绘制

第 15 章 光线投射算法

猜你喜欢

转载自blog.csdn.net/qq_35433081/article/details/93647516