US2S3L7——函数

本章代码关键字

1
2
in        //表示输入参数,用于外部传给内部,内部只会用,不会改,可以有多个
out //表示输出参数,用于内部传给外部,内部必须初始化或修改,可以有多个

函数

CG语法中的函数声明和使用几乎和C#中一模一样

区别主要是CG中的 in​ 和 out​ 关键字

  1. in​ 表示输入参数,用于外部传给内部,内部只会用,不会改,可以有多个
  2. out​ 表示输出参数,用于内部传给外部,内部必须初始化或修改,可以有多个

对于有返回值的函数,要不采用返回值形式,要不采用 out

无返回值的函数

基本结构:

1
2
3
4
void name(in 参数类型 参数名, out 参数类型 参数名)
{
函数体
}
  • void​:以 void​ 开头,表示没有返回值
  • name​:函数的名称
  • in​:表示是输入参数,表示由函数外部传递给函数内部,内部不会修改该参数,只会使用该参数进行计算,允许有多个
  • out​:表示是输出参数,表示由函数内部传递给函数的调用者,在函数内部必须对该参数值进行初始化或修改,允许有多个

注意:
in​ 和 out​ 都可以省略,省略后就没有了 in​ 和 out​ 相关的限制
虽然可以省略,但是建议大家在编写 Shader 时不要省略 in​ 和 out
因为他们可以明确参数的传递方式,提高代码的可读性和可维护性
可以让我们更容易的理解函数是如何与参数交互的,减少潜在的误解可能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Test(in fixed inF, out fixed outF)
{
outF = inF + 10;
}

v2f vert (appdata v)
{
v2f o;

fixed f1 = 10;
fixed f2;
Test(f1, f2); //f2 = 20

return o;
}

CG语言里还存在一个不常用的关键字 inout​:它表示输入输出参数,既作为输入 in​ 又作为输出 out​ 。
参数的值可以在函数内部被修改,并且该修改会在函数调用结束后保留在参数中。在函数外部可以继续使用修改后的内容

有返回值的函数

基本结构:

1
2
3
4
5
type name(in 参数类型 参数名)
{
函数体
return 返回值;
}
  • type​:返回值类型
  • return​:返回指定类型的数据

注意:
虽然可以在有返回值的函数中使用 out​ 参数,但是这并不是常见做法,除非是一些自定义逻辑函数
对于顶点/片元着色器函数只会使用**单返回值**的方式进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
float TestFunc(in float inF)
{
return inF * 2;
}

v2f vert (appdata v)
{
v2f o;

float f3 = TestFunc(11);

return o;
}