Unity3d Shader篇(十)— 渐变纹理

文章目录

  • 前言
  • 一、什么是Unlity渐变纹理Shader?
    • 1. 渐变纹理Shader工作原理
    • 2. 渐变纹理?
    • 3. 渐变纹理的优缺点
      • 优点:
      • 缺点:
    • 4. 渐变纹理例图
  • 二、使用步骤
    • 1. Shader 属性定义
    • 2. SubShader 设置
    • 3. 渲染 Pass
    • 4. 定义结构体和顶点着色器函数
    • 5. 片元着色器函数
  • 三、效果
  • 四、总结


前言

渐变纹理(Gradient Texture)是一种常用的纹理类型,在计算机图形学中广泛应用于实现各种颜色渐变效果。本文将介绍一种使用渐变纹理的Shader效果——Unlit渐变纹理Shader的实现原理和效果展示。


一、什么是Unlity渐变纹理Shader?

1. 渐变纹理Shader工作原理

Unlity渐变纹理Shader是一种简单的Shader,它不考虑光照效果,只通过渐变纹理来定义物体的颜色。这种Shader通常用于实现一些不需要光照的特效或简单的渲染效果,如UI元素、2D特效等。

2. 渐变纹理?

渐变纹理是一种特殊的纹理,它在空间中定义了一种从一个颜色到另一个颜色的渐变。通常,渐变纹理可以是线性渐变、径向渐变、圆锥渐变等不同类型,可以根据需求选择合适的渐变方式来实现不同的效果。

3. 渐变纹理的优缺点

优点:

视觉效果丰富:渐变纹理能够在物体表面产生丰富的颜色过渡效果,从而增强了渲染结果的视觉吸引力。

简化纹理资源管理:相比于使用多张复杂的纹理图案,渐变纹理可以通过动态生成或者简单的渐变色彩来达到类似的效果,从而减少了纹理资源的管理和加载成本。

节省存储空间:对于一些简单的颜色过渡效果,使用渐变纹理可以节省大量的存储空间,特别是在移动设备等资源受限的环境下尤为重要。

灵活性:渐变纹理可以通过调整参数来实现各种不同的颜色过渡效果,具有一定的灵活性和可定制性,适用于各种不同的应用场景。

缺点:

缺乏细节:渐变纹理通常只能实现简单的颜色过渡效果,难以表现复杂的纹理细节和图案,因此在需要精细纹理展示的情况下,可能显得不够真实或者生动。

不适用于复杂纹理需求:对于需要展示复杂纹理图案或者特定材质效果的场景,渐变纹理可能无法满足需求,因为其局限性在于只能提供基本的颜色过渡效果。

可能出现颜色带状效应:在渐变纹理过渡区域较小或者颜色跨度较大的情况下,可能会出现颜色过渡不均匀、出现明显的颜色带状效应,影响渲染效果的质量。

性能消耗:渐变纹理的生成和渲染可能会消耗一定的计算资源,尤其是在需要实时生成大量渐变纹理或者对渐变纹理进行复杂的图形处理时,可能会对性能产生一定的影响。

4. 渐变纹理例图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、使用步骤

1. Shader 属性定义

// 定义属性
// 定义属性
Properties
{_RampTex("RampTex",2D)="white"{} // 渐变纹理贴图_Diffuse("Diffuse",Color)=(1,1,1,1) // 漫反射颜色属性,默认白色_Specular("Specular",Color)=(1,1,1,1) // 高光颜色属性,默认白色_Gloss("Gloss",Range(1,256))=5 // 高光反射系数
}

2. SubShader 设置

SubShader
{Tags{"RenderType" = "Opaque" // 渲染类型为不透明}LOD 100 // 细节级别
}

SubShader 定义了一组渲染设置,包括标签和细节级别。在这里,我们将渲染类型标签设置为 “Opaque”,表示物体是不透明的。

3. 渲染 Pass

Pass
{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"// 漫反射颜色属性fixed4 _Diffuse;// 高光颜色属性fixed4 _Specular;// 高光系数属性float _Gloss;// 渐变纹理贴图sampler2D _RampTex;// 渐变纹理贴图的附属属性float4 _RampTex_ST;
}

这里开始了渲染 Pass 部分。在这里,我们使用了 CGPROGRAM 指令来声明顶点着色器和片元着色器函数。#pragma vertex vert#pragma fragment frag 分别指定了顶点着色器函数和片元着色器函数的名称。

然后,我们包含了 UnityCG.cgincLighting.cginc,它们提供了许多有用的函数和宏,用于简化编写 Shader。

4. 定义结构体和顶点着色器函数

struct v2f {float4 vertex: SV_POSITION;// 世界空间法线fixed3 worldNormal: TEXCOORD0;// 世界空间位置fixed3 worldPos: TEXCOORD1;// 纹理坐标float2 uv: TEXCOORD2;
};// 顶点着色器函数
v2f vert(appdata_base v) {v2f o;// 顶点位置变换到裁剪空间o.vertex = UnityObjectToClipPos(v.vertex);// 世界空间法线fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);o.worldNormal = worldNormal;// 计算纹理坐标o.uv = TRANSFORM_TEX(v.texcoord, _RampTex);/ 世界空间位置o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;
}

顶点着色器的输入是一个结构体appdata_base ,它包含了顶点的位置、法线、贴图坐标等信息。顶点着色器的输出是一个结构体 v2f ,它包含了顶点的裁剪空间位置、法线、世界空间位置等信息。

5. 片元着色器函数

fixed4 frag(v2f i): SV_Target {// 获取环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;// 获取光源方向并计算漫反射fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed halfLambert = max(0, dot(worldLightDir, i.worldNormal) * 0.5 + 0.5);fixed3 diffuse = _LightColor0.rgb * tex2D(_RampTex, fixed2(halfLambert, halfLambert)) * _Diffuse.rgb;// 计算视角方向和高光反射fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 halfDir = normalize(worldLightDir + viewDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(i.worldNormal, halfDir)), _Gloss);fixed3 color = diffuse + ambient + specular;return fixed4(color, 1);
}

片元着色器的输入是一个结构体 v2f ,它包含了顶点的裁剪空间位置、法线、世界空间位置等信息。片元着色器的输出是一个 fixed4 类型的颜色值,它表示了最终屏幕上的像素颜色。

三、效果

右:切线空间       左:世界空间

四、总结

Unlit渐变纹理Shader是一种简单而实用的Shader,它不考虑光照效果,只使用渐变纹理来定义物体的颜色。通过本文的介绍,读者可以了解到Unlit渐变纹理Shader的实现原理和使用方法,并且了解到它适用于哪些场景。这种Shader通常用于实现一些简单的渲染效果,如UI元素、2D特效等。

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

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

相关文章

Linux下的GDB

1.前言 GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c程序员,GDB是必不可少的工具 2.GDB使用帮助 GDB命令拥有较多内部命令。在gdb命令提示符下输入help可以查看所有内部命令及使用说明 …

Mediapipe笔记:安装Mediapipe+手部检测+动作识别

Mediapipe 安装Mediapipe 打开Anaconda prompt检查环境和python运行环境是否一致(默认base环境,不用切换)输入命令行pip install mediapipe0.9.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple Mediapope完成手部关键点检测 手部检测 创建对象(加载模型参数)…

(二十二)devops持续集成开发——jenkins服务代理Agent搭建

前言 在Jenkins 中,代理(Agent)是一种用于执行构建、部署和其他任务的计算节点。代理节点可以是物理机器、虚拟机或容器,它们负责接收 Jenkins 主控节点委派的任务并执行这些任务。通过使用代理节点,可以有效地分担Je…

Redis内存淘汰策略详解

Redis作为一个高性能的键值对数据库,被广泛应用于各种需要快速响应和持久存储的场景中。然而,由于其内存存储的特性,当Redis的内存使用达到其最大配置限制时,就需要有一种策略来管理内存的使用,以避免内存溢出。这就是…

NLP Seq2Seq模型

🍨 本文为[🔗365天深度学习训练营学习记录博客🍦 参考文章:365天深度学习训练营🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mi…

深入理解Linux线程(LWP):概念、结构与实现机制(2)

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:会いたい—Naomile 1:12━━━━━━️💟──────── 4:59 🔄 ◀️ ⏸ ▶️ ☰ &a…

Vue3+vite打包后页面空白问题

vite.config.js vite.config.js 增加 base: ./ import { fileURLToPath, URL } from node:url import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({base: ./,resolve: {alias: {: fileURLToPath…

解析短视频美颜SDK:美颜美型技术的深度剖析

美颜并非简单的滤镜叠加,而是依托着先进的图像处理和人工智能技术,才能够达到如此出色的效果。本文将深入探讨短视频美颜SDK背后的技术原理和实现方法,从而揭示其美颜美型技术的深度剖析。 一、美颜SDK的基本原理 美颜SDK的基本原理是通过对…

maven 包管理平台-01-maven 入门介绍 + Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…

docker单机启动mysql、redis容器命令

将your_path、your_password、your_version替换成自己需要的 mysql docker run -d -p 3306:3306 --name mysql --restartalways \ -v /your_path/my.cnf:/etc/mysql/my.cnf \ -v /your_path/log:/logs \ -v /your_path/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDyour_pa…

java 企业培训管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 企业培训管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

UCWSC

feature fusion neural network based on a decomposition mechanism (FFDM) 辅助信息 作者未提供代码

学习大数据,所必需的java基础(6)

文章目录 集合Set集合介绍HashSet集合的介绍和使用LinkedHashSet的介绍以及使用哈希值哈希值的计算方式HashSet的存储去重的过程 Map集合Map的介绍HashMap的介绍以及使用HashMap的两种遍历方式方式1:获取key,然后再根据key获取value方式2:同时…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

Docker技术概论(4):Docker CLI 基本用法解析

Docker技术概论(4) Docker CLI 基本用法解析 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:http…

Python实现PPT演示文稿中视频的添加、替换及提取

无论是在教室、会议室还是虚拟会议中,PowerPoint 演示文稿都已成为一种无处不在的工具,用于提供具有影响力的可视化内容。PowerPoint 提供了一系列增强演示的功能,在其中加入视频的功能可以大大提升整体体验。视频可以传达复杂的概念、演示产…

ArkTS中的路由跳转和HTTP数据请求

路由跳转 步骤1:找到箭头所指的文件,在其中添加已创建的页面 步骤2:导包 步骤3: HTTP数据请求 步骤1:导包 > import http from ohos.net.http; 步骤2:(如果需要在页面加载前请求&#xf…

TcpServer服务器管理模块(模块十)

目录 类功能 类定义 类实现 编译测试 server.cc gdb测试断点 忽略SIGPIPE信号 类功能 类定义 // TcpServer服务器管理模块(即全部模块的整合) class TcpServer { private:uint64_t _next_id; // 这是一个自动增长的连接IDint _port;i…

Linux学习-C语言-运算符

目录 算术运算符: - * /:不能除0 %:不能对浮点数操作 :自增与运算符 i:先用再加 i:先加再用 --:自减运算符 常量,表达式不可以,--,变量可以 赋值运算符 三目运算符 逗号表达式 size…

alpine创建lnmp环境alpine安装nginx+php5.6+mysql

前言 制作lnmp环境,你可以在alpine基础镜像中安装相关的服务,也可以直接使用Dockerfile创建自己需要的环境镜像。 注意:提前确认自己的alpine版本,本次创建基于alpine3.6进行创建,官方在一些版本中删除了php5 1、拉取…