19.CG-流程控制语句
19.1 知识点
条件分支语句
CG中的条件分支语句和C#中一模一样:
- if语句
- switch语句
条件分支语句的使用和C#中一致。下面是示例代码:
// if语句
fixed f1 = 1;
fixed f2 = 2;
fixed fResult;
if (f1 < f2)
{
fResult = 4.5; // f1小于f2时,fResult为4.5
}
else
{
fResult = 6.7; // 否则,fResult为6.7
}
// switch语句
fixed fSwitch = 1.0;
switch ((int)fSwitch)
{
case 0:
fSwitch = 0.0; // 当fSwitch为0时,fSwitch设置为0.0
break;
case 1:
fSwitch = 2.0; // 当fSwitch为1时,fSwitch设置为2.0
break;
default:
fSwitch = -1.0; // 否则,fSwitch设置为-1.0
break;
}
循环语句
CG中的循环语句和C#中一模一样:
- for循环
- while循环
- do while循环
循环语句的使用和C#中一致。下面是示例代码:
// for循环
fixed sumFor = 0.0;
for (int i = 0; i < 3; i++)
{
sumFor += 1.0; // 循环3次,每次sumFor加1.0,最终sumFor为3.0
}
// while循环
fixed sumWhile = 0.0;
int countWhile = 0;
while (countWhile < 3)
{
sumWhile += 1.0; // 循环3次,每次sumWhile加1.0,最终sumWhile为3.0
countWhile++;
}
// do while循环
fixed sumDoWhile = 0.0;
int countDoWhile = 0;
do
{
sumDoWhile += 1.0; // 循环3次,每次sumDoWhile加1.0,最终sumDoWhile为3.0
countDoWhile++;
}
while (countDoWhile < 3);
总结
CG语法中的流程控制语句和C#中的使用一模一样。在使用它们时要更多的考虑性能消耗:
- 尽量少的使用循环语句,如果一定要用要减少次数和复杂度。
- 要利用GPU并行性这一特点来替代循环。
- 尽量避免复杂的条件分支。
19.2 知识点代码
Lesson19_CG_流程控制语句
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson19_CG_流程控制语句 : MonoBehaviour
{
void Start()
{
#region 知识点一 条件分支语句
//1.if语句
//2.switch语句
//条件分支语句的使用和C#中一模一样
#endregion
#region 知识点二 循环语句
//1.for循环
//2.while循环
//3.do while循环
//循环语句的使用和C#中一模一样
#endregion
#region 总结
//CG语法中的流程控制语句和C#中的使用一模一样
//需要注意的是
//在使用它们时要更多的考虑性能消耗
//1.尽量少的使用循环语句,如果一定要用要减少次数和复杂度
//2.要利用GPU并行性这一特点来替代循环
//3.尽量避免复杂的条件分支
#endregion
}
}
Lesson19_NewUnlitShader
Shader "ShaderTeach/Lesson19_NewUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags
{
"RenderType"="Opaque"
}
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o, o.vertex);
//条件分支语句
// if语句
fixed f1 = 1;
fixed f2 = 2;
fixed fResult;
if (f1 < f2)
{
fResult = 4.5; // f1小于f2时,fResult为4.5
}
else
{
fResult = 6.7; // 否则,fResult为6.7
}
// switch语句
fixed fSwitch = 1.0;
switch ((int)fSwitch)
{
case 0:
fSwitch = 0.0; // 当fSwitch为0时,fSwitch设置为0.0
break;
case 1:
fSwitch = 2.0; // 当fSwitch为1时,fSwitch设置为2.0
break;
default:
fSwitch = -1.0; // 否则,fSwitch设置为-1.0
break;
}
//循环语句
// for循环
fixed sumFor = 0.0;
for (int i = 0; i < 3; i++)
{
sumFor += 1.0; // 循环3次,每次sumFor加1.0,最终sumFor为3.0
}
// while循环
fixed sumWhile = 0.0;
int countWhile = 0;
while (countWhile < 3)
{
sumWhile += 1.0; // 循环3次,每次sumWhile加1.0,最终sumWhile为3.0
countWhile++;
}
// do while循环
fixed sumDoWhile = 0.0;
int countDoWhile = 0;
do
{
sumDoWhile += 1.0; // 循环3次,每次sumDoWhile加1.0,最终sumDoWhile为3.0
countDoWhile++;
}
while (countDoWhile < 3);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com