1、计算机图形学
MOOC 计算机图形学
1 了解计算机直线光栅化的三种算法
1)DDA算法 利用直线的斜截式方程获得所画直线的光栅点
2)中点算法 利用直线的一般式方程根据所画直线与电脑屏幕的纵向光栅交点以中点判断符号决定Y取值,计算出所需屏幕像素点
Shader自学练习
1)mul(unity_ObjectToWorld, float4(pos, 1.0)) 是新的将局部空间顶点数据转换至世界空间数据的api。用到世界空间顶点数据的api都会调用这个方法,比如计算光照方向
// Computes world space light direction, from object space position
// *Legacy* Please use UnityWorldSpaceLightDir instead
inline float3 WorldSpaceLightDir( in float4 localPos )
{
float3 worldPos = mul(unity_ObjectToWorld, localPos).xyz;
return UnityWorldSpaceLightDir(worldPos);
}
2) TRONSFORM_TEX(flort4 v.uv, _MainTex )
(1)简单来说,TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的。 (v.texcoord就是顶点的uv)
下面这两个函数是等价的。
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
_MainTex_ST.xy中是tiling
_MainTex_ST.zw中是offset
(2)而_MainTex_ST的ST是应该是SamplerTexture的意思 ,就是声明_MainTex是一张采样图,也就是会进行UV运算。 如果没有这句话,是不能进行TRANSFORM_TEX的运算的。_MainTex_ST.xy为 下图中的Tiling,zw为下图中的offset.
如果Tiling 和Offset你留的是默认值,即Tiling为(1,1) Offset为(0,0)的时候,可以不用
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
换成o.uv = v.texcoord.xy;也是能正常显示的;相当于Tiling 为(1,1)Offset为(0,0),但是如下图自己填的Tiling值和Offset值就不起作用了
https://www.cnblogs.com/wonderKK/p/5217882.html
tex2D(_MainTex, i.uv)
tex2D(sampler2D tex, float2 s)
函数,这是CG程序中用来在一张贴图中对一个点进行采样的方法,返回一个float4。这里对 _MainTex在输入点上进行了采样,并将其颜色的rbg值赋予了输出的像素颜色,将a值赋予透明度。于是,着色器就明白了应当怎样工作:即找到贴图上 对应的uv点,直接使用颜色信息来进行着色.
saturate
saturate返回是0到1,而小于0的时候,也就是物体的背面,他永远是返回0
abs 返回的是绝对值,他才可以把物体背面的法线由负方向变成正常向