Unity中 URP 下的棋盘格Shader

文章目录

  • 前言
  • 一、制作思路
    • 法1:使用纹理采样后,修改重铺效果
    • 法2:计算实现
  • 二、粗略计算实现棋盘格效果
    • 1、使 uv.x < 0.5 区域 = 0 。反之, = 0.5
    • 2、使 uv.y < 0.5 区域 = 0 。反之, = 0.5
    • 3、使两个颜色相加
    • 4、取小数部分
    • 5、乘以2
  • 三、去除 if 条件语句后的精简方法
    • 1、我们在图形计算器中看一下
    • 2、向下取整
    • 3、乘以2
    • 4、我们在属性面板使用参数控制棋盘格重复度
    • 5、使棋盘格Shader适用于Cube
    • 6、使棋盘格颜色从下到上渐变
    • 7、我们可以给棋盘格Cube加一个父对象,使缩放时,不会Cube中心为调整的位置(按需使用)
    • 8、可以在属性面板加一个颜色来调整棋盘格颜色(按需使用)
  • 四、测试代码


前言

我们展示我们Shader效果,一般放于棋盘格中来展示。我们在这篇文章中,制作棋盘格效果。


一、制作思路

法1:使用纹理采样后,修改重铺效果

法2:计算实现

我们在这篇文章中,主要计算实现该效果


二、粗略计算实现棋盘格效果

1、使 uv.x < 0.5 区域 = 0 。反之, = 0.5

if(i.uv.x < 0.5)
col1 = 0;
else
col1 = 0.5;

在这里插入图片描述

2、使 uv.y < 0.5 区域 = 0 。反之, = 0.5

if(i.uv.y < 0.5)
col2 = 0;
else
col2 = 0.5;

在这里插入图片描述

3、使两个颜色相加

在这里插入图片描述

4、取小数部分

frac(col1 + col2)

在这里插入图片描述

5、乘以2

return 2 * frac(col1 + col2);

在这里插入图片描述


三、去除 if 条件语句后的精简方法

1、我们在图形计算器中看一下

  • 当 y = x 下取整后,把 x 轴缩小为原来的二分之一,y轴也缩小为原来的二分之一
  • 即可在(0,1)之间实现 0.5以下 = 0,0.5以上 = 0.5的效果。
    在这里插入图片描述

float2 uv = floor(i.uv * 2) * 0.5;
return uv.x + uv.y;

在这里插入图片描述

2、向下取整

float col = frac(uv.x +uv.y);

在这里插入图片描述

3、乘以2

float col = frac(uv.x +uv.y) * 2;

在这里插入图片描述

4、我们在属性面板使用参数控制棋盘格重复度

  • 属性面板

_Repeat(“Repeat”,Float) = 0

  • CBUFFER 常量缓存区

CBUFFER_START(UnityPerMaterial)
float _Repeat;
CBUFFER_END

  • 在 顶点着色器 对 uv 进行传值时,使乘以_Repeat以达到修改重复度的目的

o.uv = v.uv * _Repeat;

请添加图片描述

5、使棋盘格Shader适用于Cube

因为我们的棋盘格一般为一个Cube。那么要看见内部的东西,则需要把面片的前面剔除

Cull Front

请添加图片描述

6、使棋盘格颜色从下到上渐变

因为,我们棋盘格的颜色单一且过曝,看着很不舒服。所以,我们给其加一个遮罩,让其有点渐变的区分

  • 渐变遮罩效果,我们肯定会想到使用模型的本地空间下的坐标。所以,我们用本地空间下的y坐标实现。
  • 这里需要准备在片元着色器中,传入模型顶点本地空间下的坐标

float mask = i.vertexOS.y;
return col + mask;

在这里插入图片描述

7、我们可以给棋盘格Cube加一个父对象,使缩放时,不会Cube中心为调整的位置(按需使用)

8、可以在属性面板加一个颜色来调整棋盘格颜色(按需使用)

col = col *_Color + mask;

请添加图片描述


四、测试代码

我们需要适配BRP。所以,得加一个SubShader以同样的逻辑实现该效果

Shader "MyShader/URP/P3_3_3"
{
    Properties
    {
        _Repeat("Repeat",Float) = 0
        _Color("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags
        {
            "PenderPipeline"="UniversalPipeline"
            "RenderType"="Opaque"
            "Queue"="Geometry"
        }
        Cull Front
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attribute
            {
                float3 vertexOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varying
            {
                float3 vertexOS : TEXCOORD0;
                float4 vertexCS : SV_POSITION;
                float2 uv : TEXCOORD1;
            };

            CBUFFER_START(UnityPerMaterial)
                float _Repeat;
                float4 _Color;
            CBUFFER_END

            Varying vert(Attribute v)
            {
                Varying o;
                o.vertexOS = v.vertexOS;
                o.vertexCS = TransformObjectToHClip(v.vertexOS);
                o.uv = v.uv * _Repeat;
                return o;
            }

            half4 frag(Varying i) : SV_Target
            {
                /*half4 col1;
                half4 col2;
                if(i.uv.x < 0.5)
                    col1 = 0;
                else
                    col1 = 0.5;
                if(i.uv.y < 0.5)
                    col2 = 0;
                else
                    col2 = 0.5;*/
                half4 col;
                float2 uv = floor(i.uv * 2) * 0.5;
                col = frac(uv.x + uv.y) * 2;
                float mask = i.vertexOS.y;
                col = col * _Color + mask;
                return col;
            }
            ENDHLSL
        }
    }
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
            "Queue"="Geometry"
        }
        Cull Front
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float3 vertexOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float3 vertexOS : TEXCOORD0;
                float4 vertexCS : SV_POSITION;
                float2 uv : TEXCOORD1;
            };

            float _Repeat;
            float4 _Color;

            v2f vert(appdata v)
            {
                v2f o;
                o.vertexOS = v.vertexOS;
                o.vertexCS = UnityObjectToClipPos(v.vertexOS);
                o.uv = v.uv * _Repeat;
                return o;
            }

            half4 frag(v2f i) : SV_Target
            {
                half4 col;
                float2 uv = floor(i.uv * 2) * 0.5;
                col = frac(uv.x + uv.y) * 2;
                float mask = i.vertexOS.y;
                col = col * _Color + mask;
                return col;
            }
            ENDCG
        }
    }
}

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

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

相关文章

Selenium Wire - 扩展 Selenium 能够检查浏览器发出的请求和响应

使用 Selenium 进行自动化操作时&#xff0c;会存在很多的特殊场景&#xff0c;比如会修改请求参数、响应参数等。 本篇将介绍一款 Selenium 的扩展&#xff0c;即能够检查浏览器发出的请求和响应 - Selenium Wire。 简介 Selenium Wire 扩展了 Selenium 的 Python 绑定&…

修复泰坦陨落2缺少msvcr120.dll的5种方法,亲测有效

游戏《泰坦陨落2》缺少msvcr120.dll的问题困扰着许多玩家。这个问题的主要原因可能是系统环境不完整、软件或游戏版本不匹配、DLL文件丢失或损坏以及杀毒软件误判等。msvcr120.dll是Microsoft Visual C 2013 Redistributable的一个组件&#xff0c;它包含了许多运行库文件&…

JavaScript中的await-async-事件循环-异常处理

一、async、await 1.异步函数 async function async关键字用于声明一个异步函数&#xff1a; async是asynchronous单词的缩写&#xff0c;异步、非同步&#xff1b; sync是synchronous单词的缩写&#xff0c;同步、同时&#xff1b; async异步函数可以有很多中写法&#x…

Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…

关键点检测_labelme标注的json,随机裁剪(添加偏移相当于数据增强)

import json import os import numpy as np import cv2 import glob import csv import random#通过表格获取csv # def csv_tws(root, name): # csv_path = root+"/csv/{}.png.csv".format(name)

Java并发(二十)----synchronized原理进阶

1、小故事 故事角色 老王 - JVM 小南 - 线程 小女 - 线程 房间 - 对象 房间门上 - 防盗锁 - Monitor-重量级锁 房间门上 - 小南书包 - 轻量级锁 房间门上 - 刻上小南大名 - 偏向锁 -对象专属于某个线程使用 批量重刻名 - 一个类的偏向锁撤销到达 20 阈值 -批量重偏向 …

linux之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

Postman使用总结--生成测试报告

1.执行生成的命令格式 newman run 用例集文件 .json -e 环境文件 .json -d 数据文件 .json/.csv -r htmlextra --reporter- htmlextra-export 测试报告名 .html -e 和 -d 是 非必须的。 如果没有使用 环境&#xff0c;不需要指定 -e 如果没有使用 数据…

二叉树【数据结构】

目录 二叉树1. 二叉树定义二叉树的存储定义 2. 遍历二叉树(1) 前序遍历(2) 中序遍历(3) 后序遍历(4) 层序遍历 3. 二叉树的相关操作(1) 二叉树的初始化(2) 二叉树的结点的手动创建(3) 二叉树结点的个数(4) 二叉树叶子结点的个数(5) 二叉树的高度(6) 第k层结点个数(7) 通过前序遍…

机场信息集成系统系列介绍(4):机场信息集成总线系统

机场信息集成总线系统是一种专为机场运营管理设计的先进系统&#xff0c;旨在提高机场的航班调度指挥效率&#xff0c;同时为机场各生产部门提供航班保障计划的制定和实时调整功能。该系统的核心用户是机场运控部门。 机场信息集成总线系统&#xff08;Airport Information In…

Qt-QTransform介绍与使用

QTransform是一个用于二维坐标系转换的类。我们知道Qt的坐标系是左上角为原点&#xff0c;x轴向右&#xff0c;y轴向下&#xff0c;屏幕上每个像素代表一个单位&#xff0c;那么&#xff0c;如果我们想要在屏幕上建立自己的坐标系用于绘制&#xff0c;就需要借助QTransform。 …

什么品牌的猫罐头好吃?五大性价比高的猫罐头测评

不知不觉已经养猫两年啦&#xff0c;大大小小也算是尝试过很多猫罐头了。一开始我也是踩了很多坑&#xff0c;各种踩雷。我深知猫罐头的各种门道&#xff0c;新手一不小心就会着道了。 作为一个经营猫咖5年的老板&#xff0c;大促期间我总能捡漏&#xff0c;屯到一大波好吃又放…

一、Java基础语法

注意&#xff1a; ​ 用记事本打开本文档&#xff0c;格式较差。 ​ 可安装typora软件后再次打开。 ​ 安装包位于&#xff1a;day01\资料\其他软件\阅读笔记的软件\typora-setup-x64.exe day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作…

JS的浅拷贝和深拷贝

首先理解什么是浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a; 浅拷贝只会复制对象的第一层属性&#xff0c;而不会递归地复制嵌套的对象。浅拷贝仅复制对象的引用&#xff0c;新对象和原始对象仍然共享相同的引用&#xff0c;因此对新对象的修改可能会影响到原始对象。浅拷…

Postman/Apifox使用教程

Postman/Apifox使用教程 1. 界面导航说明2.发送第一个请求3. 工具的基础功能3.1 常见类型的接口请求3.1.1 查询参数的接口请求3.1.2 表单类型的接口请求3.1.3 上传文件的表单请求3.1.4 json类型的接口请求 3.2 接口响应数据解析 附录 1. 界面导航说明 2.发送第一个请求 http:/…

css的filter全属性介绍

原图&#xff1a; 模糊&#xff08;blur&#xff09; 单位可为px或rem&#xff0c;值越大&#xff0c;越模糊 filter:blur(3px) filter:blur(0.3rem) 亮度(brightness) 值可为数字或百分数&#xff0c;小于1时&#xff0c;亮度更暗&#xff1b;等于1时&#xff0c;无变化&am…

非递归实现的快速排序

目录 序列文章 前言 学前补充 非递归快速排序 注意事项&#xff08;重要&#xff09; 实现步骤 代码实现 时空复杂度 快速排序的特性 栈的相关代码 序列文章 非递归实现的快速排序&#xff1a;http://t.csdnimg.cn/UEcL6 快速排序的挖坑法与双指针法&#xff1a;ht…

如何免费搭建私人电影网站(二)

前一篇的准备工作做好后就进行下面的具体操作 1、免费主机申请步骤 产品——立即开通 开通成功后会出现IP地址和网站地址如下图 点击进去管理 设置FTP密码和MYSQL数据库密码 设置好后&#xff0c;就可以通过FTP文件上传工具&#xff0c;将下载好的网站模版上传到空间了 FTP…

178. 第K短路(A*启发式算法)

178. 第K短路 - AcWing题库 给定一张 N 个点&#xff08;编号 1,2…N&#xff09;&#xff0c;M 条边的有向图&#xff0c;求从起点 S 到终点 T 的第 K 短路的长度&#xff0c;路径允许重复经过点或边。 注意&#xff1a; 每条最短路中至少要包含一条边。 输入格式 第一行包…

python self用法详解

对于在类体中定义的实例方法&#xff0c;Python 会自动绑定方法的第一个参数&#xff08;通常建议将该参数命名为 self&#xff09;&#xff0c;第一个参数总是指向调用该方法的对象。根据第一个参数出现位置的不同&#xff0c;第一个参数所绑定的对象略有区别&#xff1a; 在…