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

文章目录

  • 前言
  • 一、 我们先了解一下 Shader Graph 怎么操作
    • 1、了解一下 Shader Graph 的面板信息
    • 2、修改Shader路径
    • 3、鼠标中键 或 Alt + 鼠标左键 移动画布
    • 4、鼠标右键 打开创建节点菜单
    • 5、把ShaderGraph节点转化为 Shader 代码
    • 6、可以看出 URP 和 BuildIn RP 大体框架一致
  • 二、把ShaderGraph转化后的 Shader 只保留最基础的通用前向渲染Pass
    • 1、我们看一下 URP Pass不可用后使用的默认Shader


前言

在之前的文章中,我们学习了 ShaderLab 中 BuildIn Render Pipeline 下的Shader书写。在这篇文章中,我们来了解一下 URP 下 的最简Shader怎么编写。


一、 我们先了解一下 Shader Graph 怎么操作

1、了解一下 Shader Graph 的面板信息

在这里插入图片描述

2、修改Shader路径

在这里插入图片描述

3、鼠标中键 或 Alt + 鼠标左键 移动画布

4、鼠标右键 打开创建节点菜单

在这里插入图片描述

5、把ShaderGraph节点转化为 Shader 代码

  • 可以直接 查看 或 复制 编译后的Shader
    在这里插入图片描述

6、可以看出 URP 和 BuildIn RP 大体框架一致

在这里插入图片描述


二、把ShaderGraph转化后的 Shader 只保留最基础的通用前向渲染Pass

因为是由ShaderGraph转化过来的。所以,这里虽然简化了。但是,还是过于臃肿,在之后的文章中,我们来优化一下

Shader "MyShader/P2_10"
{Properties {}SubShader{Tags{"RenderPipeline"="UniversalPipeline""RenderType"="Opaque""Queue"="Geometry"}Pass{Name "Universal Forward"Tags{// LightMode: <None>}// Render StateCull BackBlend One ZeroZTest LEqualZWrite On// Debug// <None>// --------------------------------------------------// PassHLSLPROGRAM// Pragmas#pragma target 2.0#pragma multi_compile_instancing#pragma multi_compile_fog#pragma instancing_options renderinglayer#pragma vertex vert#pragma fragment frag// Keywords#pragma multi_compile _ LIGHTMAP_ON#pragma multi_compile _ DIRLIGHTMAP_COMBINED#pragma shader_feature _ _SAMPLE_GI#pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3#pragma multi_compile_fragment _ DEBUG_DISPLAY#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION// GraphKeywords: <None>// Defines#define ATTRIBUTES_NEED_NORMAL#define ATTRIBUTES_NEED_TANGENT#define VARYINGS_NEED_POSITION_WS#define VARYINGS_NEED_NORMAL_WS#define FEATURES_GRAPH_VERTEX/* WARNING: $splice Could not find named fragment 'PassInstancing' */#define SHADERPASS SHADERPASS_UNLIT#define _FOG_FRAGMENT 1/* WARNING: $splice Could not find named fragment 'DotsInstancingVars' */// custom interpolator pre-include/* WARNING: $splice Could not find named fragment 'sgci_CustomInterpolatorPreInclude' */// Includes#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderGraphFunctions.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DBuffer.hlsl"#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/ShaderPass.hlsl"// --------------------------------------------------// Structs and Packing// custom interpolators pre packing/* WARNING: $splice Could not find named fragment 'CustomInterpolatorPrePacking' */struct Attributes{float3 positionOS : POSITION;float3 normalOS : NORMAL;float4 tangentOS : TANGENT;#if UNITY_ANY_INSTANCING_ENABLEDuint instanceID : INSTANCEID_SEMANTIC;#endif};struct Varyings{float4 positionCS : SV_POSITION;float3 positionWS;float3 normalWS;#if UNITY_ANY_INSTANCING_ENABLEDuint instanceID : CUSTOM_INSTANCE_ID;#endif#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;#endif#if (defined(UNITY_STEREO_INSTANCING_ENABLED))uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;#endif#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;#endif};struct SurfaceDescriptionInputs{};struct VertexDescriptionInputs{float3 ObjectSpaceNormal;float3 ObjectSpaceTangent;float3 ObjectSpacePosition;};struct PackedVaryings{float4 positionCS : SV_POSITION;float3 positionWS : INTERP0;float3 normalWS : INTERP1;#if UNITY_ANY_INSTANCING_ENABLEDuint instanceID : CUSTOM_INSTANCE_ID;#endif#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))uint stereoTargetEyeIndexAsBlendIdx0 : BLENDINDICES0;#endif#if (defined(UNITY_STEREO_INSTANCING_ENABLED))uint stereoTargetEyeIndexAsRTArrayIdx : SV_RenderTargetArrayIndex;#endif#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)FRONT_FACE_TYPE cullFace : FRONT_FACE_SEMANTIC;#endif};PackedVaryings PackVaryings(Varyings input){PackedVaryings output;ZERO_INITIALIZE(PackedVaryings, output);output.positionCS = input.positionCS;output.positionWS.xyz = input.positionWS;output.normalWS.xyz = input.normalWS;#if UNITY_ANY_INSTANCING_ENABLEDoutput.instanceID = input.instanceID;#endif#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0;#endif#if (defined(UNITY_STEREO_INSTANCING_ENABLED))output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx;#endif#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)output.cullFace = input.cullFace;#endifreturn output;}Varyings UnpackVaryings(PackedVaryings input){Varyings output;output.positionCS = input.positionCS;output.positionWS = input.positionWS.xyz;output.normalWS = input.normalWS.xyz;#if UNITY_ANY_INSTANCING_ENABLEDoutput.instanceID = input.instanceID;#endif#if (defined(UNITY_STEREO_MULTIVIEW_ENABLED)) || (defined(UNITY_STEREO_INSTANCING_ENABLED) && (defined(SHADER_API_GLES3) || defined(SHADER_API_GLCORE)))output.stereoTargetEyeIndexAsBlendIdx0 = input.stereoTargetEyeIndexAsBlendIdx0;#endif#if (defined(UNITY_STEREO_INSTANCING_ENABLED))output.stereoTargetEyeIndexAsRTArrayIdx = input.stereoTargetEyeIndexAsRTArrayIdx;#endif#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)output.cullFace = input.cullFace;#endifreturn output;}// --------------------------------------------------// Graph// Graph PropertiesCBUFFER_START(UnityPerMaterial)CBUFFER_END// Object and Global properties// Graph Includes// GraphIncludes: <None>// -- Property used by ScenePickingPass#ifdef SCENEPICKINGPASSfloat4 _SelectionID;#endif// -- Properties used by SceneSelectionPass#ifdef SCENESELECTIONPASSint _ObjectId;int _PassValue;#endif// Graph Functions// GraphFunctions: <None>// Custom interpolators pre vertex/* WARNING: $splice Could not find named fragment 'CustomInterpolatorPreVertex' */// Graph Vertexstruct VertexDescription{float3 Position;float3 Normal;float3 Tangent;};VertexDescription VertexDescriptionFunction(VertexDescriptionInputs IN){VertexDescription description = (VertexDescription)0;description.Position = IN.ObjectSpacePosition;description.Normal = IN.ObjectSpaceNormal;description.Tangent = IN.ObjectSpaceTangent;return description;}// Custom interpolators, pre surface#ifdef FEATURES_GRAPH_VERTEXVaryings CustomInterpolatorPassThroughFunc(inout Varyings output, VertexDescription input){return output;}#define CUSTOMINTERPOLATOR_VARYPASSTHROUGH_FUNC#endif// Graph Pixelstruct SurfaceDescription{float3 BaseColor;};SurfaceDescription SurfaceDescriptionFunction(SurfaceDescriptionInputs IN){SurfaceDescription surface = (SurfaceDescription)0;surface.BaseColor = IsGammaSpace() ? float3(0.5, 0.5, 0.5) : SRGBToLinear(float3(0.5, 0.5, 0.5));return surface;}// --------------------------------------------------// Build Graph Inputs#ifdef HAVE_VFX_MODIFICATION#define VFX_SRP_ATTRIBUTES Attributes#define VFX_SRP_VARYINGS Varyings#define VFX_SRP_SURFACE_INPUTS SurfaceDescriptionInputs#endifVertexDescriptionInputs BuildVertexDescriptionInputs(Attributes input){VertexDescriptionInputs output;ZERO_INITIALIZE(VertexDescriptionInputs, output);output.ObjectSpaceNormal = input.normalOS;output.ObjectSpaceTangent = input.tangentOS.xyz;output.ObjectSpacePosition = input.positionOS;return output;}SurfaceDescriptionInputs BuildSurfaceDescriptionInputs(Varyings input){SurfaceDescriptionInputs output;ZERO_INITIALIZE(SurfaceDescriptionInputs, output);#ifdef HAVE_VFX_MODIFICATION#if VFX_USE_GRAPH_VALUESuint instanceActiveIndex = asuint(UNITY_ACCESS_INSTANCED_PROP(PerInstance, _InstanceActiveIndex));/* WARNING: $splice Could not find named fragment 'VFXLoadGraphValues' */#endif/* WARNING: $splice Could not find named fragment 'VFXSetFragInputs' */#endif#if UNITY_UV_STARTS_AT_TOP#else#endif#if defined(SHADER_STAGE_FRAGMENT) && defined(VARYINGS_NEED_CULLFACE)#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN output.FaceSign =                    IS_FRONT_VFACE(input.cullFace, true, false);#else#define BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGN#endif#undef BUILD_SURFACE_DESCRIPTION_INPUTS_OUTPUT_FACESIGNreturn output;}// --------------------------------------------------// Main#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/Varyings.hlsl"#include "Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Includes/UnlitPass.hlsl"// --------------------------------------------------// Visual Effect Vertex Invocations#ifdef HAVE_VFX_MODIFICATION#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/VisualEffectVertex.hlsl"#endifENDHLSL}}FallBack "Hidden/Shader Graph/FallbackError"
}

1、我们看一下 URP Pass不可用后使用的默认Shader

使用的是内置渲染管线,返回颜色为洋葱紫

Shader "Hidden/Universal Render Pipeline/FallbackError"
{SubShader{Tags{"RenderType" = "Opaque""RenderPipeline" = "UniversalPipeline""IgnoreProjector" = "True"}Pass{HLSLPROGRAM#pragma target 2.0#pragma editor_sync_compilation// -------------------------------------// Shader Stages#pragma vertex vert#pragma fragment frag// -------------------------------------// Unity defined keywords#pragma multi_compile _ STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON//--------------------------------------// GPU Instancing#include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"// -------------------------------------// Includes#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"struct appdata_t{float4 vertex : POSITION;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex : SV_POSITION;UNITY_VERTEX_OUTPUT_STEREO};v2f vert (appdata_t v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);o.vertex = TransformObjectToHClip(v.vertex.xyz);return o;}float4 frag (v2f i) : SV_Target{return float4(1,0,1,1);}ENDHLSL}}Fallback "Hidden/Core/FallbackError"
}

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

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

相关文章

隐私计算介绍

这里只对隐私计算做一些概念性的浅显介绍&#xff0c;作为入门了解即可 目录 隐私计算概述隐私计算概念隐私计算背景国外各个国家和地区纷纷出台了围绕数据使用和保护的公共政策国内近年来也出台了数据安全、隐私和使用相关的政策法规 隐私计算技术发展 隐私计算技术安全多方计…

C# WPF上位机开发(usb设备访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 目前很多嵌入式设备都支持usb访问&#xff0c;特别是很多mcu都支持高速usb访问。和232、485下个比较&#xff0c;usb的访问速度和它们基本不在一个…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分&#xff0c;可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;通常指函数或者类&#xff0c;一般是开发完成的。 单元…

工业数据的特殊性和安全防护体系探索思考

随着工业互联网的发展&#xff0c;工业企业在生产运营管理过程中会产生各式各样数据&#xff0c;主要有研发设计数据、用户数据、生产运营数据、物流供应链数据等等&#xff0c;这样就形成了工业大数据&#xff0c;这些数据需要依赖企业的网络环境和应用系统进行内外部流通才能…

【Python】—— NumPy基础及取值操作

NumPy基础及取值操作 第1关&#xff1a;ndarray对象第2关&#xff1a;形状操作第3关&#xff1a;基础操作第4关&#xff1a;随机数生成第5关&#xff1a;索引与切片 第1关&#xff1a;ndarray对象 任务描述 本关任务&#xff1a;根据本关所学知识&#xff0c;补全代码编辑器中…

react基于antd二次封装spin组件

目录 react基于antd二次封装spin组件组件使用组件效果 react基于antd二次封装spin组件 组件 import { Spin } from antd; import propTypes from "prop-types"; import React from react; import styleId from "styled-components"; // 使用 父div必须加…

【爬虫课堂】如何高效使用短效代理IP进行网络爬虫

目录 一、前言 二、代理IP的基本知识 三、短效代理IP的优势 四、高效使用短效代理IP的技巧 1. 多源获取代理IP 2. 质量筛选代理IP 3. 使用代理池 4. 定时更换代理IP 5. 失败重试机制 6. 监控和自动化 五、示例代码 六、结语 一、前言 网络爬虫是一种自动化程序&am…

MongoDB中的关系

本文主要介绍MongoDB中的关系。 目录 MongoDB的关系嵌入关系引用关系 MongoDB的关系 MongoDB是一个非关系型数据库&#xff0c;它使用了键值对的方式来存储数据。因此&#xff0c;MongoDB没有像传统关系型数据库中那样的表、行和列的概念。相反&#xff0c;MongoDB中的关系是通…

LLM之RAG实战(五)| 高级RAG 01:使用小块检索,小块所属的大块喂给LLM,可以提高RAG性能

RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;系统从给定的知识库中检索相关信息&#xff0c;从而使其能够生成事实信息、上下文相关信息和特定领域的信息。然而&#xff0c;在有效检索相关信息和生成高质量响应方面&#xff0c;RAG面临…

【网络安全】-Linux操作系统—CentOS安装、配置

文章目录 准备工作下载CentOS创建启动盘确保硬件兼容 安装CentOS启动安装程序分区硬盘网络和主机名设置开始安装完成安装 初次登录和配置更新系统安装额外的软件仓库安装网络工具配置防火墙设置SELinux安装文本编辑器配置SSH服务 总结 CentOS是一个基于Red Hat Enterprise Linu…

美颜SDK是什么?视频美颜SDK在直播平台中的集成与接入教程详解

当下&#xff0c;主播们追求更加自然、精致的外观&#xff0c;而观众也期待在屏幕前欣赏到更为清晰、美丽的画面。为了满足这一需求&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台的重要利器之一。 一、什么是美颜SDK&#xff1f; 通过美颜SDK&#xff0c;开发者可以…

Kotlin Multiplatform的现状—2023年网络研讨会

Kotlin Multiplatform的现状—2023年网络研讨会 在2023年&#xff0c;Kotlin Multiplatform因其开发、当前状态和未来潜力而受到了相当大的关注。随着越来越多的开发者对采用KMP进行跨平台解决方案表示兴趣&#xff0c;JetBrains在11月下旬推出了一系列网络研讨会作为回应。首…

“去 Android化”为何蔚然成风?

早在2008年时&#xff0c;国内市场诞生了第一批自研手机OS&#xff0c;由于种种缘由铩羽而归&#xff0c;“优化Android ”貌似成为了本土特色。而从2023年下半年开始掀起了一股"去安卓化"的热潮&#xff0c;像华为、小米、vivo等都不约而同的站在了同一战线。 “去…

bisect_left,bisect_right,bisect的用法,区别以源码分析

bisect_left(*args, **kwargs) 向一个数组插入一个数字&#xff0c;返回应该插入的位置。 如果这个数字不存在于这个数组中&#xff0c;则返回第一个比这个数大的数的索引 如果这个数字存在&#xff0c;则返回数组中这个数的位置的最小值&#xff08;即最左边那个索引&#xf…

使用Kaptcha实现的验证码功能

目录 一.需求 二.验证码功能实现步骤 验证码 引入kaptcha依赖 完成application.yml配置文件 浏览器显示验证码 前端页面 登录页面 验证成功页面 后端 此验证码功能是以SpringBoot框架下基于kaptcha插件来实现的。 一.需求 1.页面生成验证码 2.输入验证码&#xff…

Kafka-Kafka基本原理与集群快速搭建(实践)

Kafka单机搭建 下载Kafka Apache Download Mirrors 解压 tar -zxvf kafka_2.12-3.4.0.tgz -C /usr/local/src/software/kafkakafka内部bin目录下有个内置的zookeeper(用于单机) 启动zookeeper&#xff08;在后台启动&#xff09; nohup bin/zookeeper-server-start.sh conf…

如何实现TensorFlow自定义算子?

在上一篇文章中 Embedding压缩之基于二进制码的Hash Embedding&#xff0c;提供了二进制码的tensorflow算子源码&#xff0c;那就顺便来讲下tensorflow自定义算子的完整实现过程。 前言 制作过程基于tensorflow官方的custom-op仓库以及官网教程&#xff0c;并且在Ubuntu和Mac…

Leetcode—11.盛最多水的容器【中等】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—11.盛最多水的容器 实现代码 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) int maxArea(int* height, int heightSize) {int left 0, right heightSize - 1;int m…

知识蒸馏:channel wise知识蒸馏CWD

论文:https://arxiv.org/pdf/2011.13256.pdf 1. 摘要 知识蒸馏用于训练紧凑型(轻量)模型被证明是一种简单、高效的方法, 轻量的学生网络通过教师网络的知识迁移来实现监督学习。大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的…

数据分析思维导图

参考&#xff1a; https://zhuanlan.zhihu.com/p/567761684?utm_id0 1、数据分析步骤地图 2、数据分析基础知识地图 3、数据分析技术知识地图 4、数据分析业务流程 5、数据分析师能力体系 6、数据分析思路体系 7、电商数据分析核心主题 8、数据科学技能书知识地图 9、数据挖掘…