Unity中 URP Shader 的纹理与采样器的分离定义

文章目录

  • 前言
  • 一、URP Shader 纹理采样的实现
    • 1、在属性面板定义一个2D变量用于接收纹理
    • 2、申明纹理
    • 3、申明采样器
    • 4、进行纹理采样
  • 二、申明纹理 和 申明采样器内部干了什么
    • 1、申明纹理
    • 2、申明采样器
  • 三、采样器设置
    • 采样器的传入格式
    • 1、纹理设置中,可以看见我们的采样器设置
    • 2、默认的采样传入
    • 3、修改采样器的 filter 模式
    • 4、修改 wrap 模式
  • 四、测试Shader
    • 1、Shader:
    • 2、测试效果
    • 3、在ShaderGraph中实现


前言

我们在这篇文章中,了解一下 URP 下Shader 纹理采样怎么实现。(URP下纹理采样 和 BRP下纹理采样不同)


一、URP Shader 纹理采样的实现

1、在属性面板定义一个2D变量用于接收纹理

_MainTex(“MainTex”,2D) = “white”{}

2、申明纹理

使用前在Pass中,我们申明纹理

  • 纹理的定义,如果是编译到GLES2.0平台,则相当于sample2D _MainTex;否则相当于 Texture2D _MainTex;

TEXTURE2D(_MainTex);

3、申明采样器

使用前在Pass中,我们申明着色器

  • 采样器的定义,如果是编译到GLES2.0平台,就相当于空;否则相当于 SamplerState sampler_MainTex;

SAMPLER(sampler_textureName):sampler+纹理名称,这种定义形式是表示采用textureName这个纹理Inspector面板中的采样方式

SAMPLER(sampler_MainTex);

4、进行纹理采样

  • 纹理采样需要提前准备 uv 信息,方法和BRP下一致

float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);


二、申明纹理 和 申明采样器内部干了什么

1、申明纹理

  • 在GLES2(比较老的平台)下,申明纹理 和 BRP 下执行的一致 :sample2D
    在这里插入图片描述
  • 在其他平台下,是一种新的定义方式 :Texture2D
    在这里插入图片描述

2、申明采样器

  • 在GLES2(比较老的平台)下,申明采样器是一个空语句。因为,sample2D包含了纹理和采样器

在这里插入图片描述

  • 在其他平台下,是一种新的定义方式 :SampleState
    在这里插入图片描述

三、采样器设置

采样器的传入格式

采样器的定义(纹理与采样器分离定义),采样器是指纹理的过滤模式与重复模式,此功能在OpenGL ES2.0上不支持,相当于没写.

  • filter:point/linear/triLinear
  • wrap:clamp/repeat/mirror/mirrorOnce

1、纹理设置中,可以看见我们的采样器设置

在这里插入图片描述

2、默认的采样传入

SAMPLER(sampler_textureName):sampler+纹理名称,这种定义形式是表示采用textureName这个纹理Inspector面板中的采样方式.

3、修改采样器的 filter 模式

SAMPLER(_filter_wrap):比如SAMPLER(sampler_linear_repeat),使用自定义的采样器设置,自定义的采样器一定要同时包含过滤模式与重复模式的设置,注意这种自定义写法很多移动平台不支持!.

  • 修改 filter 模式前:
    在这里插入图片描述
  • 修改 filter 模式后,使用采样像素点,不线性插值的方法

//SAMPLER(采样器名_过滤模式_重铺模式);
SAMPLER(SamplerState_Point_Repeat);

在这里插入图片描述

4、修改 wrap 模式

我们修改U方向平铺模式为 镜像,V方向平铺模式为 镜像

SAMPLER(SamplerState_linear_mirrorU_ClampV);

记着使用 TRANSFORM_TEX 函数,来应用重铺模式使用到的 纹理的 Tilling 和 Offset

  • Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)
    在这里插入图片描述

四、测试Shader

1、Shader:

Shader "MyShader/URP/P3_1_5"
{
    Properties 
    {
        _Color("Color",Color) = (0,0,0,0)
        _MainTex("MainTex",2D) = "white"{}
    }
    SubShader
    {
        Tags
        {
            //告诉引擎,该Shader只用于 URP 渲染管线
            "RenderPipeline"="UniversalPipeline"
            //渲染类型
            "RenderType"="Opaque"
            //渲染队列
            "Queue"="Geometry"
        }
        Pass
        {
            Name "Universal Forward"
            Tags
            {
                // LightMode: <None>
            }

            Cull Back
            Blend One Zero
            ZTest LEqual
            ZWrite On
          
            HLSLPROGRAM
            #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"

            CBUFFER_START(UnityPerMaterial)
            half4 _Color;
            CBUFFER_END

            
            //纹理的定义,如果是编译到GLES2.0平台,则相当于sample2D _MainTex;否则相当于 Texture2D _MainTex;
            TEXTURE2D(_MainTex);
            float4 _MainTex_ST;
            //采样器的定义,如果是编译到GLES2.0平台,就相当于空;否则相当于 SamplerState sampler_MainTex;
            //SAMPLER(sampler_MainTex);
            //修改纹理采样格式
            #define smp SamplerState_linear_mirrorU_ClampV
            SAMPLER(smp);
            
            //struct appdata
            //顶点着色器的输入
            struct Attributes
            {
                float3 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };
            //struct v2f
            //片元着色器的输入
            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
            };
            //v2f vert(Attributes v)
            //顶点着色器
            Varyings vert(Attributes v)
            {
                Varyings o = (Varyings)0;
                float3 positionWS = TransformObjectToWorld(v.positionOS);
                o.positionCS = TransformWorldToHClip(positionWS);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                return o;
            }
            //fixed4 frag(v2f i) : SV_TARGET
            //片元着色器
            half4 frag(Varyings i) : SV_TARGET
            {
                half4 c;
                float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,smp,i.uv);
                c = _Color *  mainTex;
                return c;
            }
            ENDHLSL
        }
    }

    FallBack "Hidden/Shader Graph/FallbackError"
}

2、测试效果

请添加图片描述

3、在ShaderGraph中实现

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue脚手架安装及使用

准备工作 安装node安装cnpm cnpm是npm的“廉价平替” 提高安装速度 npm install -g cnpm --registryhttps://registry.npm.taobao.org 安装脚手架 安装Vue脚手架 cnpm install -g vue/cli 用vue脚手架创建vue项目 找好创建项目的位置 创建项目 vue create test (test为项…

鸿蒙系统(HarmonyOS)之方舟框架(ArkUI)介绍

鸿蒙开发官网&#xff1a;HarmonyOS应用开发官网 - 华为HarmonyOS打造全场景新服务 方舟开发框架&#xff08;简称&#xff1a;ArkUI&#xff09;&#xff0c;是一套构建HarmonyOS应用界面的UI开发框架&#xff0c;它提供了极简的UI语法与包括UI组件、动画机制、事件交互等在内…

CSS文本样式(详解)

CSS文本样式 &#x1f367; 文本颜色&#x1f9c1;文本缩进&#x1f368;文本对齐&#x1f365;文本行高&#x1f95d;文本装饰 &#x1f367; 文本颜色 属性&#xff1a;color 作用&#xff1a;设置文本颜色 属性值&#xff1a; 颜色表示方式表示含义属性值颜色名称预定义的…

【专题】最小生成树(prim算法、kruscal算法)

目录 一、最小生成树二、Prim算法1. 算法思想2. 例题3. 性能分析 三、Kruscal算法1. 算法思想2. 例题3. 性能分析 一、最小生成树 生成树中边的权值&#xff08;代价&#xff09;之和最小的树。 二、Prim算法 1. 算法思想 设N(V,{E})是连通网&#xff0c;TE是N上最小生成树…

目前最火的大模型训练框架 DeepSpeed 详解来了

目前&#xff0c;大模型的发展已经非常火热&#xff0c;关于大模型的训练、微调也是各个公司重点关注方向&#xff0c;但是大模型训练的痛点是模型参数过大&#xff0c;动辄上百亿&#xff0c;如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。…

虚拟机启动 I/O error in “xfs_read_agi+0x95“

1.在选择系统界面按e 进入维护模式 2.找到ro把ro改成 rw init/sysroot/bin/sh 然后按Ctrlx 3.找到坏掉的分区&#xff0c;以nvme0n1p3为例进行修复 xfs_repair -d /dev/nvme0n1p3 4.init 6 重新启动 以下情况 先umount 再修复 则修复成功

《使用ThinkPHP6开发项目》 - 登录接口一

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…

Rabbitmq消息重复消费问题(幂等性保障)

消息百分百投递架构 在《消息可靠性保证》篇章中&#xff0c;我通过生产者确认机制保障了消息会发送到MQ中&#xff0c;但是在生产者与MQ建立过程的时候出现了网络抖动&#xff0c;连接建立失败&#xff0c;生产者就感知不到MQ返回的ack/nack&#xff0c;无法完全保障消息投递…

配电室环境智能监测系统

配电室环境智能监测系统是一种先进的在线监测系统&#xff0c;依托电易云-智慧电力物联网&#xff0c;用于实时监测配电室内部的环境参数&#xff0c;包括温度、湿度、SF6气体浓度、烟雾浓度等。该系统具有以下功能特点&#xff1a; 实时监测&#xff1a;系统能够实时监测配电室…

windows wsl2 ubuntu上部署 redroid云手机

Redroid WSL2部署文档 下载wsl内核源码 #文档注明 5.15和5.10 版本内核可以部署成功&#xff0c;这里我当前最新的发布版本 #下载wsl 源码 wget --progressbar:force --output-documentlinux-msft-wsl-5.15.133.1.tar.gz https://codeload.github.com/microsoft/WSL2-Linux-Ker…

nginx 1.24.0 安装nginx最新稳定版

1.官网&#xff1a; nginx: download 2. 选择稳定版&#xff1a; 3. 可以下载&#xff0c;然后上传服务器&#xff0c;也可以wget获取&#xff1a; cd /home wget https://nginx.p2hp.com/download/nginx-1.24.0.tar.gz 4. 放入/home 下。并解压缩&#xff0c;重命名nginx;…

基于ssm电影网站源码和论文

随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。它将是直接管理电影网站的最新形式。本论文是以构建电影网站为目标&#xff0c;使用 java技术制作&#xff0c;由管理员和用户两大部分组成。…

R语言|分面中嵌入趋势线

简介 关于分面的推文&#xff0c;小编根据实际科研需求&#xff0c;已经分享了很多技巧。例如&#xff1a; 分面中添加不同表格 分面中添加不同的直线 基于分面的面积图绘制 分面中的细节调整汇总 基于分面的折线图绘制 最近科研中又遇到了与分面相关的需求&#xff1a;…

【WINCC制作水管水流动画】

&#xff37;&#xff29;&#xff2e;&#xff23;&#xff23;简单制作水管水流动画 详情如下图所示&#xff1a; 1.首先用布化好管道&#xff0c;同时在管道内部画好折线图用以表示水流路径 2.选中折线图调整全局颜色方案 3.选择线条颜色 4.调整线条的线宽和线型 5.效果…

Enterprise Portal Standard Edition [WS_ENT_STD]

拾取坐标系统 i18n internationalization-CSDN博客 另外一种网站 Content Management System(CMS)-CSDN博客

【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换

前言 【Unity 实用工具篇】| 游戏多语言解决方案&#xff0c;官方插件Localization 实现本地化及多种语言切换一、多语言本地化插件 Localization1.1 介绍1.2 效果展示1.3 使用说明 二、 插件导入并配置2.1 安装 Localization2.2 全局配置 三、多语言映射表3.1 创建多语言文本配…

Git 使用教程(超级详细)

目录 一&#xff1a;Git二&#xff1a;SVN与Git的的区别三、安装Git四&#xff1a;常规操作五&#xff1a;远程仓库六&#xff1a;创建与合并分支七&#xff1a;bug分支八&#xff1a;多人协作九&#xff1a;git可视化工具 Git Git 是一种分布式版本控制系统&#xff0c;用于…

Knife4j-的使用(详细教程)

参考文档:Knife4j-的使用(详细教程)_knife4j使用-CSDN博客 前言 之前有写过 swagger 怎么使用的教程&#xff0c;但是现在很多项目用的接口文档其实是 Knife4j&#xff0c;Knife4j 它是对 swagger 在线接口文档的一个增强&#xff0c;按照官网的话说就是给 swagger 做了一个更…

数据结构之----数组、链表、列表

数据结构之----数组、链表、列表 什么是数组&#xff1f; 数组是一种线性数据结构&#xff0c;它将相同类型的元素存储在连续的内存空间中。 我们将元素在数组中的位置称为该元素的索引。 数组常用操作 1. 初始化数组 我们可以根据需求选用数组的两种初始化方式&#xff…

Redis分布式锁存在哪些问题,该如何解决?

假设有这样一个场景&#xff0c;在一个购票软件上买一张票&#xff0c;但是此时剩余票数只有一张或几张&#xff0c;这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下&#xff0c;正常的逻辑是首先判断当前是否还有剩余的票&#xff0c;如果有&#xff0c;那么…