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
        }
    }
}

四、下集预告

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

相关推荐
郝学胜-神的一滴2 天前
基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
c++·qt·线性代数·矩阵·游戏引擎·图形渲染
EQ-雪梨蛋花汤2 天前
【Unity笔记】Unity 编辑器扩展:打造一个可切换 Config.assets 的顶部菜单插件
unity·编辑器·游戏引擎
SmalBox2 天前
【URP】UnityHLSL顶点片元语义详解
unity·渲染
在路上看风景2 天前
9. Mono项目与Unity的关系
unity
在路上看风景2 天前
1.12 Memory Profiler Package - Summary
unity
SmalBox2 天前
【URP】Unity Shader Tags
unity·渲染
极客柒3 天前
Unity 塔防自用可视化路点寻路编辑器
unity·编辑器·游戏引擎
程序猿多布3 天前
Unity AssetBundle详解
unity·assetbundle
萘柰奈3 天前
Unity学习----【进阶】Addressables(二)--加载资源与打包及更新
学习·unity
lvcoc3 天前
unity 接入火山引擎API,包括即梦AI
windows·unity·ai·火山引擎