Unity中Shader纹理的环绕方式

news2025/1/11 17:54:53

文章目录

  • 前言
  • 一、修改环绕方式前的设置准备
  • 二、在纹理的设置面板可以修改环绕方式
  • 三、在Shader中,实现纹理的环绕方式切换
    • 1、在属性面板定义一个和纹理面板一样的纹理环绕方式下拉框
    • 2、在Pass中,定义枚举对应的变体
    • 3、在片元着色器中,纹理采样前,使用 #if 判断后做出对应的修改
  • 四、最终效果


前言

Unity中Shader纹理的环绕方式

我们基于上一篇的代码来继续实现

  • Unity中Shader纹理的过滤

一、修改环绕方式前的设置准备

我们先把我们Shader中主纹理的Tiling修改大于1

只有大于1的部分,才会采用纹理的环绕方式

在这里插入图片描述


二、在纹理的设置面板可以修改环绕方式

在这里插入图片描述


三、在Shader中,实现纹理的环绕方式切换

1、在属性面板定义一个和纹理面板一样的纹理环绕方式下拉框

[KeywordEnum (Repeat,Clamp)]_WrapMode(“WrapMode”,int) = 0

[KeywordEnum (Enum0, Enum1, Enum2, Enum3, Enum4, Enum5, Enum6, Enum7, Enum8)]
关键字枚举,需要#pragma multi_compile _XXX_ENUM0 _XXX_ENUM1 …来依次声明变体关键字,XXX为这条属性中声明的变量名,在cg/hlsl中可以通过#if #elif #endif分别做判断.

2、在Pass中,定义枚举对应的变体

这里的变体,不需要程序运行时动态修改。所以使用shader_feature变体,不用multi_compile变体

#pragma shader_feature _WRAPMODE_REPEAT _WRAPMODE_CLAMP

3、在片元着色器中,纹理采样前,使用 #if 判断后做出对应的修改

  • 我们先在片元着色器中,判断条件后返回两个颜色测试一下

//WrapMode
#if _WRAPMODE_REPEAT
return 1;
#elif _WRAPMODE_CLAMP
return 0;
#endif

效果:
请添加图片描述

  • 我们来实现 _WRAPMODE_REPEAT的效果

在大于纹理的1倍以上的部分重复采样

实现时,取小数部分即可,这样就会重复采样 0 ~ 1的部分
在这里插入图片描述

i.uv = frac(i.uv);

  • 我们来实现_WRAPMODE_CLAMP的效果

在大于纹理的一倍以上的部分舍弃采样

法1:
在这里插入图片描述

法2:
在这里插入图片描述

//法一:
//i.uv = clamp(i.uv,0,1);
//法二:
i.uv = saturate(i.uv);


四、最终效果

请添加图片描述

最终代码:

//纹理的多级渐远 Mipmap
//纹理的环绕方式
Shader "MyShader/P2_1_3"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        [KeywordEnum (Repeat,Clamp)]_WrapMode("WrapMode",int) = 0
        [IntRange]_Mipmap ("Mipmap",Range(0,10)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma shader_feature _WRAPMODE_REPEAT _WRAPMODE_CLAMP
            #include "UnityCG.cginc"
            
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            half _Mipmap;
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //WrapMode
                #if _WRAPMODE_REPEAT
                i.uv = frac(i.uv);
                #elif _WRAPMODE_CLAMP
                    //法一:
                    //i.uv = clamp(i.uv,0,1);
                    //法二:
                    i.uv = saturate(i.uv);
                #endif
                
                

                
                float4 uvMipmap = fixed4(i.uv,0,_Mipmap);
                fixed4 col = tex2Dlod(_MainTex, uvMipmap);
                return col;
            }
            ENDCG
        }
    }
}

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

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

相关文章

【数据结构与算法】JavaScript实现树结构(一)

文章目录 一、树结构简介1.1.简单了解树结构1.2.树结构的表示方式 二、二叉树2.1.二叉树简介2.2.特殊的二叉树2.3.二叉树的数据存储 三、二叉搜索树3.1.认识二叉搜索树3.2.二叉搜索树应用举例 一、树结构简介 1.1.简单了解树结构 什么是树? 真实的树:…

Redis数据库双写一致性解决方案

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

SpringCloud微服务:Nacos和Eureka的区别

目录 配置: 区别: ephemeral设置为true时 ephemeral设置为false时(这里我使用的服务是order-service) 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…

vscode调试pytorch的DistributedDataParallel代码

这里写自定义目录标题 一、查找launch.py二、修改launch.json三、特别提醒3.1 错误的写法3.2 正确的写法 一、查找launch.py 使用代码。 find / -name launch.py | grep distributed得到的结果如下 这里我们得到了两个结果,看目标文件的路径名,第二个…

深度学习到智能小车(1)深度学习框架

0.前提 最近新开了一门叫机器学习的课程,老师一直在跟我们讲一些有关这方面的知识,告诉我们一定要学好数学,因为数学是算法的基础。我手上的donkeycar刚好也涉及到Keras深度神经网络,所以出于好奇我去图书馆借回了一本叫《Keras深…

一键免费去除视频水印和字幕的AI工具

最近有学员经常让我分享好用的智能抹除视频水印字幕AI工具,今天就给大家分享一个我经常用到的这款工具——腾讯智影,这个平台提供的智能抹除功能,借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…

端口映射软件

今天给大家介绍一个自己制作的工具,本工具可以把本地自己的项目映射到外网可以访问,自己有域名可以使用自己的,没有可以用软件自带的三级域名! Token获取 地址:传送 打开上面网址注册账号,然后点击验证,复制里面的值即可。 软件…

openpyxl获取单元格的主题色的颜色值

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! openpyxl 支持以下几种颜色类型: RGB (Red, Green, …

Stable Diffusion - StableDiffusion WebUI 软件升级与扩展兼容

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134463035 目前,StableDiffusion WebUI 的版本是 1.6.0,同步更新 controlnet、tagcomplete、roop、easy-prompt-selector等…

Go 语言变量类型和声明详解

在Go中,有不同的变量类型,例如: int 存储整数(整数),例如123或-123float32 存储浮点数字,带小数,例如19.99或-19.99string - 存储文本,例如“ Hello World”。字符串值用…

批量替换WordPress文章内图片链接

在WordPress使用过程中,如果中途更换了域名,原先文章内的图片使用的是原来的域名,就会造成文章页里面的图片链接无法显示。如果从后台文章挨个修改就比较麻烦。可以通过数据库进行批量替换即可。 使用 PHPMyadmin 打开 数据库,登…

我所理解的 UI Toolkit 启蒙阶段(一)

我所理解的 UI Toolkit 启蒙阶段(一) 对于自己不会的新东西的学习,我认为最合适的路径就是: 实例教学视频 —> 实操熟悉 —> 官方文档查漏补缺 —> 拟定思路实现功能 但这 4 步并非每一步都需要下 100% 的功夫&#x…

Linux C 线程

线程 概述线程和进程的异同如何选择使用进程还是线程 函数获取进程自身ID  pthread_self创建线程  pthread_create退出线程  pthread_exit线程等待  pthread_join 四种线程模型1 )单线程2 )单线程3 )双线程4 )三线程 概述…

选择Amazon EC2,走进云端新时代

目录 前言 选择云服务器 / 海外服务器需要关注的重点 Amazon EC2 云服务器的优势所在 文末总结 前言 常言道,工欲善其事必先利其器,无论你是资深开发者,还是普通爱好者,在日常开发和学习生活中都需要用到云服务器提供的丰富的…

自建es数据迁移阿里云方案

一、ElasticSearch数据迁移方法介绍 https://help.aliyun.com/document_detail/170095.html?spma2c4g.26937906.0.0.429240c9ymiXGm 可以通过Logstash、reindex和OSS等多种方式完成阿里云Elasticsearch间数据迁移、Elasticsearch数据迁移至Openstore存储中、自建Elasticsear…

GB28181学习(十六)——基于jrtplib实现tcp被动和主动收流

前言 GB/T28181-2022实时流的传输方式介绍:https://blog.csdn.net/www_dong/article/details/134255185 tcp passive收流 流程图 注意: m字段指定传输方式为TCP/RTP/AVP;sdp信息中增加"asetup:passive";SIP服务器启…

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比

Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则,有两种方式: 1. 代码方式:在服务消费者order-service中的OrderApplication类中,定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…

技术分享 | 如何写好测试用例?

对于软件测试工程师来说,设计测试用例和提交缺陷报告是最基本的职业技能。是非常重要的部分。一个好的测试用例能够指示测试人员如何对软件进行测试。在这篇文章中,我们将介绍测试用例设计常用的几种方法,以及如何编写高效的测试用例。 ## 一…

【Rust】快速教程——模块mod与跨文件

前言 道尊:没有办法,你的法力已经消失,我的法力所剩无几,除非咱们重新修行,在这个世界里取得更多法力之后,或许有办法下降。——《拔魔》 \;\\\;\\\; 目录 前言跨文件mod多文件mod 跨文件mod //my_mod.rs…

C#语言的由来与发展历程

C#语言的由来与发展历程可以追溯到2000年,当时微软公司为了在.NET平台上开发应用程序,发布了一种新的编程语言——C#。C#语言的设计目标是成为一种简单、现代、通用和面向对象的编程语言,为开发者提供更强大的生产力、更强大的面向对象支持和…