Unity的Shader学习笔记(04)[20/12/19_周六][11-14]

目录

课时11:Cg语言入门3-数据类型和Swizzel操作

课时12:Cg语言入门4-流程控制

课时13:Cg语言入门5_自定义函数

课时14:Cg语言入门6-内置函数


周六了,要抱小孩,抽空看看视频,比较基础的,等小孩睡了,记录一下笔记。

这几个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,根据颜色调试,没有输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值