【Unity】shader中参数传递

1、前言

unity shader这个对于我来说是真的有点难,今天这篇文章主要还是总结下最近学习到的一些东西,避免过段时间忘记了,可能有不对,欢迎留言纠正。

2、参数传递的两种方式

2.1 语义传递

语义传递这个相对来说是简单的

shader "Custom/e1"
{SubShader{Pass {CGPROGRAM//表示vert函数是顶点着色器代码#pragma vertex vert //表示fragment函数是片元着色器代码#pragma fragment frag//声明新的结构体包含顶点着色器需要的模型数据//a表示应用,v表示顶点着色器,a2v意思就是把数据从应用阶段传递到顶点着色器中struct a2v{// POSITION语义告诉Unity用模型空间的顶点坐标填充vertex变量float4 vertex : POSITION;// NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量float3 normal : NORMAL;// TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量float4 texcoord : TEXCOORD0;};float4 vert(a2v v) : SV_POSITION{//Unity内置的模型·观察·投影矩阵return UnityObjectToClipPos (v.vertex);}fixed4 frag() : SV_Target{//返回一个颜色的fixed4类型变量return fixed4(0.3,0.4,1.0,1.0);}ENDCG}}
}

POSITION 和 SV_POSITION 都是语义

怎么理解语义呐? 可以简单理解为语义数据就是GPU内部固定的容器,只能存储固定类型的数据。

那么,填充到POSITION,TANGENT,NORMAL这些语义中的数据究竟从哪里来的呢?在Unity中,他们是由该材质的Mesh Render组件提供的。在每帧调用Draw Call的时候,Mesh Render组件会把它负责渲染的模型数据发送给Unity Shader。我们知道,一个模型通常包含一组三角面片,每个三角面片由3个顶点构成,而每个顶点又包含一些数据,例如顶点位置,法线,切线,纹理坐标,顶点颜色等。通过上面的方法,我们就可以在顶点着色器中访问顶点的这些模型数据。

下面是顶点着色器输入语义:

语义描述
POSITION顶点的坐标信息,通常为float3或者float4类型
NORMAL顶点的法线信息,通常为float3类型
TEXCOORD0模型的第一套UV坐标,通常为float2、float3或者float4类型,TEXCOORD0到TEXCOORD3分别对应为第一到第四套UV坐标
TANGENT顶点的切向量,通常为float4类型
COLOR顶点的颜色信息,通常为float4类型

下面是顶点着色器输出和片段着色器输入常用的语义:

语义描述
SV_POSITION顶点在裁切空间中的坐标,float4类型
TEXCOORD0、TEXCOORD1 等用于声明任意高精度的数据,例如纹理坐标、向量等
COLOR0、COLOR1用于声明任意低精度的数据,例如颜色、数值区间[0,1]的变量
TEXCOORDn 或者 COLORn 不特指UV和颜色,语义范围只包括但不限于此。

2.2 属性传递

属性传递的数据在整个shader中全局可用,可以理解为数据放在了GPU的显存中。

shader "Custom/e2"
{Properties{_Color ("Color Tint", Color) = (0.5,0.6,0.2,1.0)}SubShader{Pass {CGPROGRAM//表示vert函数是顶点着色器代码#pragma vertex vert //表示fragment函数是片元着色器代码#pragma fragment frag//在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量fixed4 _Color;//声明新的结构体包含顶点着色器需要的模型数据//a表示应用,v表示顶点着色器,a2v意思就是把数据从应用阶段传递到顶点着色器中struct a2v{// POSITION语义告诉Unity用模型空间的顶点坐标填充vertex变量float4 vertex : POSITION;// NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量float3 normal : NORMAL;// TEXCOORD0语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量float4 texcoord : TEXCOORD0;};//使用一个结构体来定义顶点着色器的输出struct v2f{// SV_POSITION语义告诉Unity,pos里面包含了顶点在裁剪空间中的位置信息float4 pos : SV_POSITION;// COLOR0语义可以用于储存颜色信息fixed3 color : COLOR0;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 c=i.color;c *= _Color.rgb;//返回一个颜色的fixed4类型变量return fixed4(c, 1.0);}ENDCG}}
}

上面文章的_Color 我们通过程序传入

这里有个注意点

properties块是给unity用的,这边传递的数据需要在SubShader中重新定义

转为对应的数据格式,相同的名字

比如

 Properties {    _MainTex ("Texture", 2D) = "white" {}SubShader{Pass{sampler2D _MainTex;float4 _MainTex_ST;}}
}

2.3 自定义数据传递

自定义参数传递,一般放在vert和frag之间

技巧也是通过语义进行参数传递

比如通过fixed3 color 传递一个参数到片元着色器,只是一个数据类型,可传入自己定义的数据。

3、顶点着色器

顶点着色器无法知道全局形状,而且必须要返回剪裁空间的坐标。

顶点着色器是逐顶点执行的,针对提交的每个顶点,执行一次顶点着色函数。顶点着色函数将顶点坐标进行 MVP 变换后得到的裁剪空间坐标作为返回值,提供给下一阶段的片元着色器。

1 顶点变换:对输入的顶点进行平移、旋转、缩放等变换操作,实现物体在场景中的移动和变形。

2 法向量计算:计算顶点的法向量,用于实现光照效果和阴影计算。

3 骨骼动画:根据动画控制器中的骨骼信息,对顶点进行骨骼权重计算,实现骨骼动画效果。

4 顶点着色:对顶点进行着色操作,实现多种渲染效果,如纹理贴图、颜色变换、光照模型等。

5:顶点剪裁:根据相机视锥体的位置和方向,对顶点进行剪裁操作,去除不可见的部分,提高渲染效率。

6:粒子系统:对粒子的位置、大小、颜色等进行计算和变换,实现粒子效果。

7: 其他:顶点着色器还可以实现其他一些高级的计算和变换操作,如几何变形、光线追踪等。

顶点着色器可以实现多种复杂的变换和计算操作,从而实现丰富的渲染效果。开发者可以根据自己的需求,编写相应的顶点着色器函数,实现自定义的渲染效果。

 4、片元着色器

片元着色器是逐个像素进行渲染,颜色是对两个顶点之上的颜色进行差值运算。

5、总结 

shader貌似也没那么难,主要还是光照模型,还有就是在编程的时候怎么做到从点到整体的思考

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

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

相关文章

Csharp_pta2_2

7-7 C# 1.12 区间找数 编写控制台应用程序,根据用户输入的a、b、c、d值(均为正整数且a不大于b),输出在[a, b]区间中能被c整除,但是不能被d整除的数。 输入格式: 用户在一行中输入四个正整数,分别对应a、…

数组模拟几种基本的数据结构

文章目录 数组模拟单链表数组模拟双链表数组实现栈数组模拟队列总结 数组模拟单链表 首先类比结构体存储单链表,我们需要一个存放下一个节点下标的数组,还需要一个存储当前节点的值的数组,其次就是一个int类型的索引,这个索引指向…

Python 实现视频去抖动技术

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术,它可以有效地减少视频中由于相机震动或手…

springSecurity简单直接说明

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombo…

MyBatis处理SQL中的特殊字符

方式一&#xff1a;转义字符 如下案例&#xff1a; < 表示小于的转义字符 <!-- 在Mapper XML文件中定义SQL语句 --> <select id"selectById" resultMap"BaseResultMap">select *from userwhere id < #{id}; </select>方式二&am…

设计模式:依赖倒转原则(Dependency Inversion Principle,DIP)介绍

依赖倒转原则&#xff08;Dependency Inversion Principle&#xff0c;DIP&#xff09;是面向对象设计原则之一&#xff0c;它强调高层模块不应该依赖于底层模块&#xff0c;二者都应该依赖于抽象。同时&#xff0c;抽象不应该依赖于具体实现细节&#xff0c;具体实现细节应该依…

嵌入式开发学习--进程、线程

什么是进程 进程和程序的区别 概念 程序&#xff1a;编译好的可执行文件&#xff0c;存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;&#xff0c;程序是静态的&#xff0c;没有任何执行的概念。 进程&#xff1a;一个独立的可调度的任务&#xff0c;执行一…

高可靠性部署系列(3)--- ASG双机热备(HA)

高可靠性部署系列(3)--- ASG双机热备(HA) 前言网络拓扑设备选型网络规划组网需求配置思路操作步骤步骤 1 HA接口管理地址配置步骤 2 HA全局配置步骤 3 配置同步步骤 4 接口状态同步组创建结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支…

东方博宜1009 - 数组逆序

题目描述 给你 nn 个整数&#xff0c;将其逆序输出。 输入 第一行一个整数 nn &#xff08;3 \le n \le 1003≤n≤100)代表数的个数。 第二行 nn 个整数&#xff08;空格隔开&#xff09;&#xff08;这些数在 0 \sim 10^60∼106 之间)。 输出 nn 个整数&#xff08;空格…

恶补《操作系统》3_1——王道学习笔记

3内存管理 3.1_1 内存的基础知识 1、什么是内存&#xff0c;作用 &#xff08;1&#xff09;内存&#xff1a;内存用来存放数据。程序执行前需要先放到内存中才能被CPU处理――缓和CPU与硬盘之间的速度矛盾。 &#xff08;2&#xff09;内存存储单元&#xff1a;每个地址对应…

AIGC技术的发展现状和未来趋势

AIGC&#xff08;人工智能生成内容&#xff09;技术是指利用人工智能算法自动生成文本、图像、音频、视频等各类内容的技术。随着深度学习等技术的快速发展&#xff0c;AIGC技术在最近几年取得了显著进步&#xff0c;并在多个领域展现出巨大的潜力。 ​ 编辑 发展现状&#x…

前端数字计算精度问题

计算精度问题通常发生在浮点数运算中&#xff0c;由于浮点数的表示所限&#xff0c;可能导致精度损失。 举例 // 比如 0.1 0.2 // 结果为 0.30000000000000004 0.3 - 0.1 // 结果为 0.19999999999999996vue vue 使用decimal.js 解决小数相加合计精确度丢失问题 微信小程序 …

【2024系统架构设计】回顾历史,查缺补漏篇 ①

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起

ARM功耗管理背景及挑战

安全之安全(security)博客目录导读

服务器网站漏洞怎么修复

服务器网站漏洞的修复是一个关键且复杂的过程&#xff0c;涉及到多个层面的安全加固。以下是一个关于如何修复服务器网站漏洞的详细指南。安全狗专业做服务器安全&#xff0c;有任何服务器安全问题都可以找安全狗哦. ​一、识别和分析漏洞 首先&#xff0c;要确定服务器网站存在…

基于NodeJS + Swagger UI搭建Web API界面

基于NodeJS Swagger UI搭建Web API界面 前言一、创建基于NodeJS的Swagger运行目录二、添加Swagger官方的示例1.创建public工作目录2.添加Swagger官方示例3.启动SwaggerUI实例 三、基于OpenAPI规范提供api文档 前言 Swagger是一个REST APIs文档在线自动生成和测试的框架 一、…

Linux下的基本指令(1)

嗨喽大家好呀&#xff01;今天阿鑫给大家带来Linux下的基本指令&#xff08;1&#xff09;&#xff0c;下面让我们一起进入Linux的学习吧&#xff01; Linux下的基本指令 ls 指令pwd命令cd 指令touch指令mkdir指令(重要)rmdir指令 && rm 指令(重要)man指令(重要)cp指…

基于 NXP iMX8MM 测试 Secure Boot 功能

By Toradex秦海 1). 简介 嵌入式设备对于网络安全的要求越来越高&#xff0c;而 Secure boot就是其中重要的一部分。 NXP i.MX8MM/i.MX8MP 处理器基于 HABv4 特性来提供 Secure boot 启动过程中的 Chain of Trust&#xff1b; HABv4 是基于公共密钥加密 (Public Key Cryptogr…

C语言进阶:指针的进阶(上)

首先 在学习新知识之前 我们先来回顾下之前的学习的内容 1 指针是个变量 用来存放地址 地址唯一标识的一块内存空间 2 指针的大小是固定的4/8字节&#xff08;32位平台/64位平台&#xff09; 3 指针有类型的 指针的类型决定了两点 一个是指针操作的权限以及整数的步长 4 指针的…

神经网络项目:全连接网络和卷积网络实现水果三分类项目

水果三分类项目 Git源码&#xff1a;传送门 水果种类&#xff1a;草莓、树莓、桑葚 0&#xff1a;草莓 strawberry1&#xff1a;树莓 raspberry2&#xff1a;桑葚 mulberry 项目设计 获取数据 spider.py数据清洗 cleaner.py自定义数据集 dataset.py网络构建 net.py训练模型 t…