目录
周六了,要抱小孩,抽空看看视频,比较基础的,等小孩睡了,记录一下笔记。
这几个Cg语言入门课程看完,原本陌生,神秘的Shader突然熟悉起来了。
课时11:Cg语言入门3-数据类型和Swizzel操作
#pragma target x.0
这个没写,默认2.0,现在的2020.1版本创建出来的,显示指定是4.5了,默认多少?。之前这个教程时是3.0
Shader Model,SM
bool类型,三元运算符,
Swizzle操作,xyzw,xyzx,rgba,xy,ab,挺有趣的。
Swizzle鸡尾酒?百搭?
typedef float4 FL4,类型别名
c语言知识
#define MCROFL FL4(a,b,c,d); 宏定义
宏定义的判断有吗?
大量的宏的使用
矩阵,可以使用swizzle操作
float2x4 m2x4=(f41,f42);//两行4列
col=m2x4[0];//第一行
数组,要用下标,角标
float arr[4]={0,1,2,3};//数组长度必须确定
col=float4(arr[0],arr[1],arr[2],arr[3]);
int l=arr.Length;
结构体
struct v2f {float4 pos;float2 uv;};
v2f o;
o.pos=f14;
o.uv=f12;
1.结构体里面可以嵌套结构体吗?
struct v2f {
float4 pos:POSITION;
float2 col:TEXCOORD0;
};
struct v2f2 {
float4 pos:POSITION;
float2 col:TEXCOORD0;
};
struct struct1{
float f1:POSITION;
float2 f2;
float3 f3;
float4 f4;
float2x4 f24;
float2 array2[4];
float3 array3[4];
float4x4 array44[4];
v2f o;
v2f o2;
};
struct struct2{
struct1 s1;
};
2.好像没看到char类型啊,确实不支持。
3.有全局变量吗?好像支持,但是,暂时不会。
---------------------------------------------------------------------------------------
课时12:Cg语言入门4-流程控制
不支持switch case,要用 If else;else if ;
光栅化后做了插值运算
我的效果是黑色的
先暂时不管,后续找原因。
while do while for ,
for最大次数是1024
for(i=0;i<1023;i++)
但是,2020.1好像没有这个限制,设置为100000,都没错误,能正常出结果的
----------------------------------
个人理解
vert和frag函数,实际上是一个渲染过程的大循环中的一部分,vert一次处理一个端点,像例子中的就是cube的8个点,其实就执行了8次,中间的渲染颜色用差值的方式来做。
void draw()
{
...
foreach(var objPos in allPosList)
{
float4 pos;
float4 col;
vert(in objPos,out pos,out col);//vertex函数
...
}
...
foreach(var col in allColList){
frag(col);//fragment函数
...
}
...
}
或者是
void draw()
{
...
foreach(var objPos in allPosList)
{
float4 pos;
float4 col;
vert(in objPos,out pos,out col);//vertex函数
...
frag(col);//fragment函数
...
}
...
}
疑问:
1.frag和vert到底是哪种方式呢?
2.frag里面能够位置信息吗?一次处理的也是一个坐标吗
3.我上面写的allColList是不是就是colorBuffer,记得有好几个buffer,是通过这些buffer在渲染流水线间传递数据的吗?
4.结构体里面定义函数?不行
定义后语法没error,但是shader里面会被加一句话
先继续学习
===========================================================
课时13:Cg语言入门5_自定义函数
1.前向声明,函数体在调用代码的后面时前面要声明,c语言的原来规定
2.传参都是值传递,数组也是,要在函数内改变外部的数据,参数上需要有out。
3.通过cginc文件的方式组织代码,并复用。
4.简单的函数用inline定义
可以放到Unity目录里面,应该也能放到项目中吧。
文件后缀名可以不是cginc,但是编辑器中语法提示就没有了。
===================================================================
课时14:Cg语言入门6-内置函数
数学、几何、纹理、导数
调试函数,基本没用。
百度文库 Cg标准函数库 https://wenku.baidu.com/view/3a9db318fad6195f312ba675.html
博客:https://www.cnblogs.com/zhenlong/p/5904533.html
dot(A,B),点积
lerp(a,b,f),插值
saturate(x),min(x,y),max(x,y)
transpose,转置
distance(pt1,pt2),距离
faceforward(N,I,Ng),正面
length(v),模
normalize(v),归一化
reflect(I,N),反射
refract(I,N,eta),折射
纹理映射函数,最简单,所有函数最终返回颜色
tex1D,2D,2Dproj,RECT,RECTProj,3D,3DProj
很多重载,重载规则和c语言相通
偏导函数,ddx(a),ddy(a)
调试函数,debug,根据颜色调试,没有输出。