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

目录

一、本节介绍

1 上集回顾

2 本节介绍

二、结构体的需求

1 数据的接入

2 开始写结构体

三、unity封装好的结构体

1 unity封装好了很多结构体

2 如何使用封装好的结构体

四、下集预告


一、本节介绍

1 上集回顾

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

2 本节介绍

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

二、结构体的需求

1 数据的接入

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

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

2 开始写结构体

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

:POSITION             顶点坐标

:NORMAL               法线坐标

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

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

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

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

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

  • 上一个案例的链接:

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

  • 代码写法是:
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{//调用结构体的vertexreturn UnityObjectToClipPos(v.vertex);}float4 frag():SV_TARGET{return float4(1,1,1,1);}ENDCG}}
}

三、unity封装好的结构体

1 unity封装好了很多结构体

例:

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语法,还在那个位置,进行引用

  • 例:
            //之前学的CG引用#pragma vertex vert#pragma fragment frag//unity封装好的部分结构体引用#include"UnityCG.cginc"
  • 引用案例:
Shader "Custom/001"
{
SubShader{pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include"UnityCG.cginc"//假设我们要传入 appdata_base//传入上述结构体float4 vert(appdata_base v):SV_POSITION{//调用结构体的vertexreturn UnityObjectToClipPos(v.vertex);}float4 frag():SV_TARGET{return float4(1,1,1,1);}ENDCG}}
}

四、下集预告

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Flutter 和地理位置 API 构建基于位置的移动应用程序?

基于位置的移动应用程序是当今智能手机用户的新动力。借助这些应用程序,人们可以使用地图来确定正确的路线。跟踪实时位置、搜索附近感兴趣的地点以及使用其他各种基于位置的服务 (LBS)。 如今,对基于位置的应用程序的需求大幅增加。移动应用中地理定位…

Java stream 进阶版

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

js/jquery之input 复选框checkbox、单选按钮radio选中判断

之前总是用,总是遇到坑,解决起来总是需要实践回想。通过这次使用顺便做个简单的总结, 百度了资料,推荐的这个博客很不错,下面只是做了简单的改名字处理,基本是是贴的另一个博客内容。 唯一不一样的是&…

火狐浏览器怎么设置网络代理?代理起到了哪些作用

火狐浏览器是一款流行的网页浏览器,它支持多种网络代理设置。设置网络代理可以帮助用户访问某些网站或提高网络访问速度。但是,使用代理IP时需要注意一些事项,以确保安全和正常使用。 以下是在火狐浏览器中设置网络代理的步骤: 1.…

ubuntu20.04在noetic下编译orbslam2

ubuntu20.04在noetic下编译orbslam2 参考链接1:https://blog.csdn.net/qq_58869016/article/details/128660588 参考链接2:https://blog.csdn.net/dong123456789e/article/details/129693837 在noetic下的安装环境 1.库安装 sudo apt-get update sudo …

UDP特性之广播

UDP特性之广播 1. 广播的特点2. 设置广播属性3. 广播通信流程4. 通信代码总结 1. 广播的特点 广播的UDP的特性之一,通过广播可以向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊…

《Linux从练气到飞升》No.28 Linux中的线程同步

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…

陪玩系统圈子系统:打破孤单,寻找游戏共伴!APP小程序H5三端源码交付,支持二开!喜欢软件开发的朋友可以一起交流!

在如今快节奏的生活中,游戏作为一种娱乐方式,早已融入了人们的生活,成为许多人放松心情、释放压力的方式之一。然而,与此同时,游戏中的孤独感也成为一些玩家所面临的问题。为了解决这个问题,陪玩系统圈子系…

ELK之Logstash解析json报错 JSON parse error:Unrecognized character escape ‘x‘

一、报错分析 原始报错信息: JSON parse error, original data now in message field {:message>"Unrecognized character escape x (code 120)\n at [Source: (String)\"{\"timestamp\":\"2022-06-29T10:02:0008:00\",\"s…

数据结构-矩阵

介绍 数据结构中的矩阵主要涉及以下几种: 对称矩阵:若矩阵A n*n中的元素特点是a[ij]a[ji],则称之为n阶对称矩阵。对称矩阵的每一对元素占用一个存储单元,那么对于n阶矩阵,可以压缩到n(n1)/2个元素的存储单元。对角矩阵…

C++初阶:STL之vector类模板

目录 一.vector的介绍及使用 1.1.vector的介绍 1.2.vector的使用 1.2.1.vector的定义 1.2.2.vector iterator的使用 1.2.3.vector的空间增长问题 1.2.4.vector的增删查改 1.3.vector在OJ中的使用 题一:只出现一次的数字 题二:杨辉三角 题三&a…

【vue3】处理数组方法,在数组中获取指定条件所在的数组对象等持续更新笔记~~

1、在数组中获取指定条件所在的数组对象 (1)filter方法获取到的是包含指定项的数组 data.checkRow res.result.filter(item > item.checked 1);打印: (2)map方法取到的是包含指定项的数组,如果满足…

使用splice修改数组数据 数据被修改了 但是页面视图不更新

场景 <el-tagv-for"(tag, index) in arr":key"tag":closable"true"close"onClose(index, $event)" >{{ tag }} </el-tag>// 标签关闭时触发onClose(index, e) {console.log("标签关闭", index);this.arr.splic…

解决PP材质粘合问题用PP专用UV胶水

PP材料已经广泛应用于各行各业&#xff0c;在粘接中会有不同的问题需求&#xff0c;那么使用专用于PP的UV胶水可能是解决PP材质粘合问题的一种有效方法。 主要在于&#xff1a;UV胶水在紫外线照射下可以快速固化&#xff0c;形成坚固的连接。所以使用PP专用UV胶水时可以考虑&am…

基于亚马逊云科技新功能:Amazon SageMaker Canvas无代码机器学习—以构建货物的交付状态检测模型实战为例深度剖析以突显其特性

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在亚马逊云科技开发者社区、 知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道。 目录 &#x1f680;一. Amazon SageMaker &#x1f50e;1.1 新功能发布&#xff1a;A…

AtCoder Beginner Contest 327

A - ab (atcoder.jp) AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; int n; string s; void solve() {cin>>n>>s;for(int i0;i<(int)s.size()-1;i){if((s[i]a&&s[i1]b)||(s[i]b&&s[i1]…

基于PCIe的NVMe学习

一&#xff1a;基本概念 1.UltraScale&#xff1a;是Xilinx ZYNQ 系列产品 2.spec&#xff1a;大家现在别纠结于具体的命令&#xff0c;了解一下就好。老板交代干活的时候&#xff0c;再找spec一个一个看吧————猜测估计是命令表之类的。 3.TLP报文部分&#xff1a; 二&…

关于Yii2基础controller和model的封装

如题&#xff0c;在实战项目中我们我们经常会要使用相同的逻辑&#xff0c;比如post/get获取参数&#xff0c;接口返回、参数校验等&#xff0c;因此可以将其封装起来调用。 这里分为根目录下的控制器controllers和处理数据库的models两个文件&#xff0c;其他业务逻辑放在modu…

MapReduce\Shuffle

MapReduce\Shuffle MapReduce 是一种编程模型&#xff0c;用于处理和生成大数据集。这个模型由两个主要步骤组成&#xff1a;Map步骤和Reduce步骤。 Map步骤&#xff1a;在这个步骤中&#xff0c;输入数据集被分割成多个独立的数据块&#xff0c;然后每个数据块被分配给一个M…

云桌面和桌面云是什么?中国桌面云市场谁在领跑?

当我们谈论云桌面和桌面云时&#xff0c;确实很容易产生混淆。它们都涉及到云计算技术在个人计算环境中的应用&#xff0c;但具体的应用场景和侧重点有所不同。 云桌面&#xff1a;虚拟化的桌面环境 云桌面是一种基于云计算的虚拟化技术&#xff0c;它允许用户通过互联网访问一…