Unity中Shader URP最简Shader框架(整理总结篇)

news/2024/11/20 19:33:05/

文章目录

  • 前言
  • 一、精简 ShaderGraph 所有冗余代码后的最简 URP Shader
  • 二、我们来对比一下 URP Shader 与 BuildInRP Shader 的对应关系 与 区别
    • 1、"RenderPipeline"="UniversalPipeline"
    • 2、面片剔除、深度测试、深度写入、颜色混合 和 BRP 下一致
    • 3、必须引入的库变了
    • 4、顶点着色器输入
    • 5、片元着色器输入
    • 6、顶点着色器
    • 7、片元着色器
    • 8、变量类型变化
    • 最终效果


前言

在上篇文章中,我们主要把 ShaderGraph 转化为 URP Shader,并进行了最简化。在这篇文章中,我们来解析一下 URP 最简 Shader 中做了什么。

  • Unity中Shader URP最简Shader框架(ShaderGraph 转 URP Shader)

一、精简 ShaderGraph 所有冗余代码后的最简 URP Shader

Shader "MyShader/URP/P2_10"
{Properties {}SubShader{Tags{//告诉引擎,该Shader只用于 URP 渲染管线"RenderPipeline"="UniversalPipeline"//渲染类型"RenderType"="Opaque"//渲染队列"Queue"="Geometry"}Pass{Name "Universal Forward"Tags{// LightMode: <None>}Cull BackBlend One ZeroZTest LEqualZWrite OnHLSLPROGRAM#pragma vertex vert#pragma fragment frag// Pragmas#pragma target 2.0// Includes#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"//struct appdata//顶点着色器的输入struct Attributes{float3 positionOS : POSITION;};//struct v2f//片元着色器的输入struct Varyings{float4 positionCS : SV_POSITION;};//v2f vert(Attributes v)//顶点着色器Varyings vert(Attributes v){Varyings o = (Varyings)0;float3 positionWS = TransformObjectToWorld(v.positionOS);o.positionCS = TransformWorldToHClip(positionWS);return o;}//fixed4 frag(v2f i) : SV_TARGET//片元着色器half4 frag(Varyings i) : SV_TARGET{half4 c;c.rgb = 0.5;c.a = 1;return c;}ENDHLSL}}FallBack "Hidden/Shader Graph/FallbackError"
}

二、我们来对比一下 URP Shader 与 BuildInRP Shader 的对应关系 与 区别

1、“RenderPipeline”=“UniversalPipeline”

  • 这句代码告诉Unity,我们Shader是用于哪一个渲染管线下的

2、面片剔除、深度测试、深度写入、颜色混合 和 BRP 下一致

3、必须引入的库变了

  • BRP

#include “UnityCG.cginc”

  • URP

#include “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
#include “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”

4、顶点着色器输入

//struct appdata
//顶点着色器的输入
struct Attributes
{
float3 positionOS : POSITION;
};

  • Attributes : appdata
  • positionOS : position
  • normalOS : normal
  • tangentOS : tangent

5、片元着色器输入

//片元着色器的输入
struct Varyings
{
float4 positionCS : SV_POSITION;
};

  • Varyings : v2f
  • positionCS : position 在齐次裁剪坐标系下的顶点坐标

6、顶点着色器

//v2f vert(Attributes v)
//顶点着色器
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
float3 positionWS = TransformObjectToWorld(v.positionOS);
o.positionCS = TransformWorldToHClip(positionWS);
return o;
}

  • Varyings vert(Attributes v) : v2f vert(Attributes v)
  • TransformObjectToWorld : mul(unity_ObjectToWorld,v.vertex)
  • TransformWorldToHClip : UnityObjectToClipPos(v.vertex)

7、片元着色器

//fixed4 frag(v2f i) : SV_TARGET
//片元着色器
half4 frag(Varyings i) : SV_TARGET
{
half4 c;
c.rgb = 0.5;
c.a = 1;
return c;
}

  • half4 frag(Varyings i) : fixed4 frag(v2f i)

8、变量类型变化

剔除了 fixed 类型变量

只保留:

  • float类型:一般用于 坐标 和 位置 信息存储
  • half类型:一般用于 颜色 这些精度较小的值

最终效果

在这里插入图片描述


http://www.ppmy.cn/news/1271466.html

相关文章

1 第一章 Linux 入门

第一章 Linux 入门 学习目标 1 熟悉Linux是什么 2 熟悉Linux的优势 3 可以比较Linux和Windows 4 了解Linux的常见版本 第一节 Linux是什么 Linux内核最初只是由芬兰人林纳斯 托瓦兹&#xff08;LinusTorvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Li…

Java EE 多线程之 JUC

文章目录 1. Callable 接口2. ReentrantLock3. 信号量4. CountDownLatch JUC这里就是指&#xff08;java.util.concurrent&#xff09; concurrent 就是并发的意思 这个包里的内容&#xff0c;主要就是一些多线程相关的组件 1. Callable 接口 Callable 也是一种创建线程的方式…

Vue3使用了Vite和UnoCSS导致前端项目启动报错:Error:EMFILE:too many open files

一个 Vue3 的项目&#xff0c;用的是 Vite 打包&#xff0c;通过 npm run dev 运行时&#xff0c;遇到了以下错误&#xff08;尤其是引入了 Element-Plus 后&#xff09;&#xff1a; Error: EMFILE: too many open files&#xff0c;后面是具体的文件路径。。甚至到了 node_mo…

指针相关知识(进阶)

前面的入门中已经介绍了指针的基础知识&#xff0c;接下来&#xff0c;让我们继续学习吧&#xff01; 一. 字符指针变量 char* 一般形式 int main() {char n w;char* pa &n;*pa w;return 0; } 这并不是把字符串hello world放在n中&#xff0c;而是把第一个字符的地址…

关于论坛中 Edge 问题解决教程汇总

常见问题 使用 Microsoft Edge 浏览器时&#xff0c;可能会遇到一些具体的问题&#xff0c;以下是一些常见问题及可能的解决方法&#xff1a; 1. 页面加载缓慢&#xff1a; 解决方法&#xff1a; 检查网络连接&#xff1a;确保网络连接稳定。清除浏览器缓存&#xff1a;打开…

Axure元件库的使用

1.基本元件库 1.1Axure的画布范围 Axure是一个绘制项目原型图的软件&#xff0c;它里面的基本原件有&#xff1a; 1.1元件的呈现范围 首先我们要了解基本元件的作用范围在哪里&#xff1f; 浏览效果&#xff1a; 可以看出当我们的基本元件放在画布区域内是可以完全呈现出来…

【Spring教程29】Spring框架实战:从零开始学习SpringMVC 之 服务器响应知识全面详解

目录 1 环境准备2 响应页面3 返回文本数据4 响应JSON数据5 知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配…

当指定了一个 messageid 后,发送或插入消息,即使成功,也查询不到此消息

SDK messageid 仅在发送失败时&#xff0c;可以使用 SDK 已经构建好的 id&#xff0c;不支持自己指定一个自定义的 id 值。 如果传入一个 SDK 不存在的 id 会导致消息丢失 如果传入一个 SDK 存在的但不是当前消息的 id&#xff0c;会导致原有消息内容发生变更&#xff0c;导致消…