19.CG语法流程控制语句

  1. 19.CG-流程控制语句
    1. 19.1 知识点
      1. 条件分支语句
      2. 循环语句
      3. 总结
    2. 19.2 知识点代码
      1. Lesson19_CG_流程控制语句
      2. Lesson19_NewUnlitShader

19.CG-流程控制语句


19.1 知识点

条件分支语句

CG中的条件分支语句和C#中一模一样:

  1. if语句
  2. 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#中一模一样:

  1. for循环
  2. while循环
  3. 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#中的使用一模一样。在使用它们时要更多的考虑性能消耗:

  1. 尽量少的使用循环语句,如果一定要用要减少次数和复杂度。
  2. 要利用GPU并行性这一特点来替代循环。
  3. 尽量避免复杂的条件分支。

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

×

喜欢就点赞,疼爱就打赏