Unity | Shader基础知识(第四集:Shader结构体)

目录

一、本节介绍

[1 上集回顾](#1 上集回顾)

[2 本节介绍](#2 本节介绍)

二、结构体的需求

[1 数据的接入](#1 数据的接入)

[2 开始写结构体](#2 开始写结构体)

三、unity封装好的结构体

[1 unity封装好了很多结构体](#1 unity封装好了很多结构体)

[2 如何使用封装好的结构体](#2 如何使用封装好的结构体)

四、下集预告


一、本节介绍

1 上集回顾

上一集,我们做了一个可以改变颜色的案例。

2 本节介绍

这一集,我们继续讲一个语法,在shader里写结构体。

二、结构体的需求

1 数据的接入

shader里是不好随便去声明数据的,我们前面传入数据时,用的是括号传入(如图),

但是当数据很多的时候,就会不好弄,于是引入新语法,结构体,可以把很多个数据放到一起,像之前一样写代码用。

2 开始写结构体

需求:我们现在有3个语义想用

:POSITION 顶点坐标

:NORMAL 法线坐标

:TEXCOORD0 第一套纹理坐标 //纹理坐标就UV坐标,这里不详细讲解,可以百度

代码:用结构体把这些数据都接过来

cs 复制代码
            //这里结构体的名字是可以自己起的
            struct a2v
            {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
            float4 texcoord:TEXCOORD0;
            }

这样,我们之后再用数据的时候,只需要声明一个结构体,通过结构体调用就可以了

例,修改上一个案例,加入结构体的内容

  • 上一个案例的链接:

Unity | Shader基础知识(第三集:案例<对材质颜色进行干预>)-CSDN博客

  • 代码写法是:
cs 复制代码
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            //这里结构体的名字是可以自己起的
            struct a2v
            {
            float4 vertex:POSITION;
            float3 normal:NORMAL;
            float4 texcoord:TEXCOORD0;
            };

                    //传入并声明结构体
            float4 vert(a2v v):SV_POSITION
            {
                                    //调用结构体的vertex
            return UnityObjectToClipPos(v.vertex);
            }

            float4 frag():SV_TARGET
            {
            return float4(1,1,1,1);
            }

            ENDCG
        }
    }
}

三、unity封装好的结构体

1 unity封装好了很多结构体

例:

cs 复制代码
struct appdata_base {
    float4 vertex : POSITION;//顶点坐标
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//第一纹理坐标
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
 
struct appdata_tan {
    float4 vertex : POSITION;//顶点坐标
    float4 tangent : TANGENT;//切线
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//第一纹理坐标
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
 
struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;//第二纹理坐标
    float4 texcoord2 : TEXCOORD2;//第三纹理坐标
    float4 texcoord3 : TEXCOORD3;//第四纹理坐标
    fixed4 color : COLOR;        //顶点颜色
    UNITY_VERTEX_INPUT_INSTANCE_ID    //ID信息
};
2 如何使用封装好的结构体

其实这里又是一种引用,只要我们提前引用就可以使用

之前我们引用过CG语法,还在那个位置,进行引用

  • 例:
cs 复制代码
            //之前学的CG引用
            #pragma vertex vert
            #pragma fragment frag
            
            //unity封装好的部分结构体引用
            #include"UnityCG.cginc"
  • 引用案例:
cs 复制代码
Shader "Custom/001"
{
SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include"UnityCG.cginc"

                    //假设我们要传入 appdata_base
                    //传入上述结构体
            float4 vert(appdata_base v):SV_POSITION
            {
                                    //调用结构体的vertex
            return UnityObjectToClipPos(v.vertex);
            }

            float4 frag():SV_TARGET
            {
            return float4(1,1,1,1);
            }

            ENDCG
        }
    }
}

四、下集预告

下集会根据之前的语法,学习一个数学知识,制作一个彩色的球。

相关推荐
万兴丶26 分钟前
Unnity IOS安卓启动黑屏加图(底图+Logo gif也行)
android·unity·ios
Clank的游戏栈1 小时前
Unity DOTS系列之IJobChunk来迭代处理数据
游戏·3d·unity
音视频牛哥4 小时前
音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
游戏引擎·大牛直播sdk·unity3d rtmp·unity3d rtsp·unity3d rtsp播放器·unity3d rtmp播放器·unity3d rtmp推流
_oP_i16 小时前
Unity 3D 脚本中的常用函数
unity·游戏引擎
larito16 小时前
unity 高性能对象池解决方案
unity
周周的Unity小屋16 小时前
虚幻引擎Gameplay探索 Actor 之间的高效通信与交互技巧一
游戏引擎·虚幻·actor通信
charon877819 小时前
Unreal Engine 5 C++: 编辑器工具编写入门(中文解释)
c++·ue5·编辑器·游戏引擎·虚幻
TO_ZRG1 天前
使用jenkins打包unity工程
运维·unity·jenkins
UTwelve1 天前
【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第一篇-原理】
ue5·ue4·虚幻·虚幻引擎·着色器
dangoxiba1 天前
【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角2.5D游戏
游戏·unity·c#·游戏引擎