【Unity Shader入门精要 第7章】基础纹理(三)

1. 渐变纹理

另外一种对于纹理的使用方式是通过渐变纹理为物体提供漫反射光照效果。

在这里插入图片描述
顾名思义,渐变纹理本身就是一张颜色渐变(可以是连续渐变,也可能是突变)的图片,这个渐变的过程模拟的就是光源从不同的角度照射物体的过程,因此对渐变纹理的采样通关不关心目标像素的位置信息,只关心光照角度。

通常来讲,渐变纹理都是左右不可以互相拼接的(像上图这样)。假设我们期望的采样点在纹理的最右侧(白色),但考虑到采样坐标的精度问题,实际的采样坐标可能为1.001,如果渐变纹理的 Wrap Mode 选择的是 Repeat,就会按照 0.001 进行采样,于是就会从渐变纹理的最左边进行采样(深红),从而导致一片白色中突然出现一点深红。因此,为了避免这种问题,渐变纹理的 Wrap Mode 需要选择为 Clamp。

在这里插入图片描述
如上图所示,我们在Shader中为物体设置了一张 MainTex 用于提供物体的基本颜色,然后设置了一张RampTex,用于根据光照角度提供漫反射颜色。

Shader如下:

Shader "MyShader/Chapter_7/Chapter_7_RampTexture"
{Properties{_MainTex("MainTex", 2D) = "white"{}_RampTex("RampTex", 2D) = ""{}_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 16}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _RampTex;fixed4 _Specular;half _Gloss;v2f vert(a2v v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldNormal = mul(v.normal, unity_WorldToObject);o.worldPos = mul(unity_ObjectToWorld, v.vertex);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed4 _albode = tex2D(_MainTex, i.uv);float _halfLambert = 0.5 * dot(_worldNormal, _worldLight) + 0.5;fixed4 _ramp = tex2D(_RampTex, _halfLambert.rr);fixed3 _diffuse = _LightColor0.rgb * _albode.xyz * _ramp.rgb;float3 _worldView = normalize(_WorldSpaceCameraPos.xyz - i.worldPos);float3 _h = normalize(_worldView + _worldLight);fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow(saturate(dot(_worldNormal, _h)) , _Gloss);return fixed4(_ambient + _diffuse + _specular, 1);}ENDCG}}}

效果如下:
在这里插入图片描述

2.遮罩纹理

所谓遮罩纹理,其实就是向Shader提供额外参数控制的一种手段。由于通过纹理采样可以覆盖到物体表面的每一个像素,因此我们可以通过将参数存储到纹理中为物体表面每一个像素提供更精细的控制。

比如在进行高光反射计算时,如果我们希望物体表面某些地方的高光强度更高,某些地方的高光强度更低,就可以将这个调整高光强度的系数存到一张纹理当中,在计算高光反射的最后乘以从纹理中采样得到的控制系数。

再比如我们在Shader 的 Properties 中设置了某些属性可以供使用者调整,但这个属性的值是对整个Shader生效的,或者说是对物体表面每一个像素生效的,就像之前Shader中常用的 _Gloss 属性,用于控制高光亮斑的大小,如果我们希望物体不同部分在计算高光反射时,分别按照不同的 _Gloss 值进行计算,就可以将需要的 _Gloss 值存到纹理中,在着色器中采样获得。

在这里插入图片描述

这个例子中,通过一张遮罩纹理的R通道为漫反射提供了一个额外的强度系数。

Shader如下:

Shader "MyShader/Chapter_7/Chapter_7_MaskTexture"
{Properties{_MainTex("MainTex", 2D) = "white"{}_BumpTex("BumpTex", 2D) = "bump"{}_MaskTex("MaskTex", 2D) = ""{}_MaskScale("MaskScale", float) = 5_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(1.0, 256.0)) = 16}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 tangentView : TEXCOORD1;float3 tangentLight : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpTex;sampler2D _MaskTex;half _MaskScale;fixed4 _Specular;half _Gloss;v2f vert(a2v v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);TANGENT_SPACE_ROTATION;o.tangentView = mul(rotation, ObjSpaceViewDir(v.vertex));o.tangentLight = mul(rotation, ObjSpaceLightDir(v.vertex));return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _tangentLight = normalize(i.tangentLight);fixed4 _packedNormal = tex2D(_BumpTex, i.uv);float3 _tangentNormal = UnpackNormal(_packedNormal) ;_tangentNormal.z = sqrt(1.0 - dot(_tangentNormal.xy, _tangentNormal.xy));fixed4 _albode = tex2D(_MainTex, i.uv);float _diffuseFix = tex2D(_MaskTex, i.uv).r * _MaskScale;fixed3 _diffuse = _LightColor0.rgb * _albode.xyz * saturate(dot(_tangentNormal, _tangentLight)) * _diffuseFix;float3 _tangentView = normalize(i.tangentView);float3 _h = normalize(_tangentView + _tangentLight);fixed3 _specular = _LightColor0.rgb * _Specular.xyz * pow(saturate(dot(_tangentNormal, _h)) , _Gloss);return fixed4(_ambient + _diffuse + _specular, 1);}ENDCG}}}

效果如下:
在这里插入图片描述

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

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

相关文章

Win11下Java环境安装指南

Windows下Java环境安装指南 前言一、安装简介JDK与JRE安装包 二、JDK安装检查操作系统类型基于Win11基于Win10 安装包准备工作 三、配置环境配置JAVA_HOME配置Path配置CLASSPATH 四、检验配置是否打开cmd命令行窗口输出java -version命令 五、注意事项 前言 在Windows系统上安…

移动机器人的机动性

移动机器人的机动性 机器人底盘运动学的活动性是表示它在环境中直接运动的能力。限制活动性的基本约束是每一轮子必须满足它的滑动约束的规则。所以,我们可从方程(3.26)正式地推导机器人的活动性。 除了瞬时的运动学运动之外,移动机器人通过操纵可操纵的轮子,能够随时操纵它的…

基于springboot实现的教师人事档案管理系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…

循环神经网络RNN的初学

1.循环神经网络的特点 x1——>y1的同时会产生a1,它包含了我们第一列处理信息的一些特点,然后这个a1就会被传送到y2上去,那么x2——>y2的序列中就会包含前一个的特点,依次类推,这就是我们的RNN结构**&#xff08…

八分钟“手撕”包装类与泛型

目录 一、包装类 基本数据类型和对应的包装类 装箱和拆箱 【思考题】 二、泛型 什么是泛型 引出泛型 怎么定义泛型和使用泛型 裸类型(Raw Type) 擦除机制 额外,注意下列代码: 泛型的上界 泛型的接口应用 泛型方法 一、包装类 简单来…

HNCTF_RE复现(一)

baby_python hnctf.yuanshen.life:33276 网页打不开,只能 nc 连接远程服务器。 运行没有回显 利用pickletools库进行反编译为字节码(不知道为什么) # Python 3.10.12 from pickle import loads import pickletools main b"\x80\x04ct…

windows快速计算文件的SHA256数值的步骤

在文件路径打开cmd窗口 输入命令 用Windows自带的certutil命令来计算一个文件的校验值1: certutil支持的算法有:MD2 MD4 MD5 SHA1 SHA256 SHA384 SHA512。 certutil的使用方法非常简单,只需要执行“certutil -hashfile 文件名 校验值类型”…

分享我经常用的一个图片下载插件,不会写爬虫代码也能随意下载图片

更多精彩内容在公众号。 ImageAssistant(图片助手)是一款专为Chrome浏览器设计的扩展程序,它具备强大的网页图片处理功能。以下是关于ImageAssistant的一些主要特点和功能: 批量下载图片:ImageAssistant的核心功能之一…

HackTheBox-Machines--Bank

文章目录 0x01 信息收集0x02 文件上传漏洞利用0x03 权限提升方法一:SUID提权方法二:配置不当提权 Bank 测试过程 0x01 信息收集 1.端口扫描 发现 ssh(22)、DNS(53)、HTTP(80) 端口 nmap -sC -sV 10.129.29.200访问 80 端口,页面为Apache2 U…

免费、无限量出图!字节跳动旗下这款国产AI工具,居然这么好用!(强烈推荐)

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 之前X小鹿一直在各…

软考--试题六--抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory) 意图 提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类 结构 适用性 1、一个系统要独立于它的产品的创建、组合和表示时 2、一个系统要由多个产品系统中的一个来配置时 3、当要强调一系列相关的产品对象的设…

Python中使用C扩展详解

文章目录 1. Python/C API示例2. Cython示例3. ctypes关于C扩展的进一步讨论安全性和兼容性性能优化策略调试C扩展发布和分发C扩展 应用实例:加速矩阵乘法运算1. 准备C扩展代码2. 编译C扩展3. 在Python中使用C扩展 在Python中,使用C扩展是一种提高程序性…

Leetcode - 130双周赛

目录 一,3142. 判断矩阵是否满足条件 二,3143. 正方形中的最多点数 三,3144. 分割字符频率相等的最少子字符串 四,3145. 大数组元素的乘积 一,3142. 判断矩阵是否满足条件 本题题意,满足每一列的数全部…

【Linux系统编程】第十九弹---进程状态(下)

​​​​​​​ ✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、僵尸进程 2、孤儿进程 3、运行状态 4、阻塞状态 5、挂起状态 6、进程切换 总结 1、僵尸进程 上一弹…

网工路由基础——动态路由协议(RIP)

一、动态路由协议的分类 1.按工作区域分类: 动态路由协议按用途分类可以分为内部网关协议(IGP)和外部网关协议(EGP)。一个Internet网可以被分成多个域或多个自治系统,各自治系统通过一个核心路由器…

基于语义感知的对象草图绘制

摘要 抽象是素描的核心,因为线条画的简单和最小化特性。抽象涉及识别对象或场景的基本视觉属性,这需要语义理解和对高级概念的先验知识。因此,抽象表现对艺术家来说是具有挑战性的,对机器来说更是如此。我们提出了CLIPasso&#…

软考--试题六--访问者模式(Visitor)

访问者模式(Visitor) 意图 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作 结构 适用性 1、一个对象的结构包含很多类对象,他们有不同的接口,而用户想对这些对象实施一些依赖于其具体类的操…

STL <string>--------String的OJ题目

1.题目截图(把字符串转换成整数----atoi) 1.1题目解析(在代码里) class Solution { public:int myAtoi(string str) {// 100% 97.45% int len str.size();if(len 0)return 0;int i 0, flag 1, isSignal 0, res 0;while(…

小红书孕妇宝妈暴力拉新玩法,每日两小时,单日收益500+

哎呀,你好呀,亲爱的小伙伴们!我今天心血来潮,想和你们分享一个超级棒的方法,这个方法我亲自试过,超级有效!就是在小红书上针对孕妇和宝妈们进行引流的方法。听起来是不是很有趣呀?&a…

PyCharm运行程序遇到‘[WinError 1455] 页面文件太小’的问题

最近在云环境的PyCharm运行程序,第一次遇到了WinError 1455的问题,感谢大神们给出的解决方法,特此记录一下。 错误提示是‘页面文件小’导致的问题,那么将页面调大即可。 电脑默认情况下没给D盘分配虚拟内存, 如果Python装在D盘…