Unity3d Shader篇(十)— 渐变纹理

news2024/11/15 11:30:44

文章目录

  • 前言
  • 一、什么是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.coloradmin.cn/o/1481987.html

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

相关文章

【Flutter 面试题】解释 Flutter的热重载(Hot Reload)功能

【Flutter 面试题】解释 Flutter的热重载(Hot Reload)功能 文章目录 写在前面解答补充说明 写在前面 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2…

JVM运行时数据区——本地方法接口和本地方法栈

1、本地方法接口 虽然Java语言使用非常广泛,但是有些事务Java仍然无法处理。例如线程相关的功能,在线程类当中就有很多本地方法接口。那么Java如何来处理这些问题呢?Java设计师提出了一种解决方案就是本地方法接口。本贴将会讲解本地方法接口…

spark sql 转换字符串数组成多列结构

背景 在平时使用spark sql分析数据时,特别是分析从mysql的表入仓的hive表时,我们会经常和字符串数组的列打交道,而且这种情况下我们一般都需要把一行字符串数组的行数据转成多列的形式,我们看下怎么写这个sql spark sql 转换字符…

idea中maven配置(一次成功,全部细节都有)

写这篇文章的原因是maven的配置很简单,但是也很容易出错,我连配了两台电脑的maven出现了各种小错误,参考了以下两篇博文IDEA配置Maven教程(超详细版~)_idea maven配置教程-CSDN博客 一次包会——最新IDEA配置Maven指南&#xff0…

(学习日记)2024.03.01:UCOSIII第三节

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

ABAP - OOALV 单元格 F4实现

方式一:使用标准数据表,FIELDCAT字段设置值 gs_fieldcat-ref_table X. "列可编辑gs_fieldcat-ref_table MARA. "F4 参考表gs_fieldcat-ref_field MATNR. "F4 参考字段 方式二.使用自定义数据 ,实现效果如下图…

git根据文件改动将文件自动添加到缓冲区

你需要修改以下脚本中的 use_cca: false 部分 #!/bin/bash# 获取所有已修改但未暂存的文件 files$(git diff --name-only)for file in $files; do# 检查文件中是否存在"use_cca: false"if grep -q "use_cca: false" "$file"; thenecho "Ad…

【ue5】滑铲系统蓝图笔记

大致逻辑如下: 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色,便于区分。 二、调整动画 1.启动根运动 启动根运动后,人物才可以位移,不然只能在原地。 打开动画序列,勾选启用根运动Enabled…

【排序算法】基数排序

一:基本概念 1.1 基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是…

Python读取hbase数据库

1. hbase连接 首先用hbase shell 命令来进入到hbase数据库,然后用list命令来查看hbase下所有表,以其中表“DB_level0”为例,可以看到库名“baotouyiqi”是拼接的,python代码访问时先连接: def hbase_connection(hbase…

如何开好一家汽车美容店,汽车美容保养与装饰教学

一、教程描述 本套教程共由17张VCD组合而成,教程内容主要包括:美容店的设立和管理,汽车系统与内部结构,汽车美容工具与美容设备,美容用品的选择与使用,车身打蜡镀膜与内外清洁,车身抛光与漆面处…

Verilog(未完待续)

Verilog教程 这个教程写的很好,可以多看看。本篇还没整理完。 一、Verilog简介 什么是FPGA?一种可通过编程来修改其逻辑功能的数字集成电路(芯片) 与单片机的区别?对单片机编程并不改变其地电路的内部结构&#xff0…

【框架】Spring 框架重点解析

Spring 框架重点解析 1. Spring 框架中的单例 bean 是线程安全的吗? 不是线程安全的 Spring 框架中有一个 Scope 注解,默认的值是 singleton,即单例的;因为一般在 Spring 的 bean 对象都是无状态的(在生命周期中不被…

vue3 + vite 项目可以使用纯Js开发吗?

答案:可以 创建项目: 按照链接参考或者按官方: webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件,在任意文件当中,如果我们模块使用js写的,那么我们需要 将all…

微软为金融界带来革命性突破——推出Microsoft 365中的下一代AI助手:Microsoft Copilot for Finance

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

【leetcode】相交链表

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 点击查看题目 思路: struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *he…

数据分析之Logistic回归分析(二元逻辑回归、多元有序逻辑回归、多元无序逻辑回归)

1、Logistic回归分类 在研究X对于Y的影响时: 如果Y为定量数据,那么使用多元线性回归分析;如果Y为定类数据,那么使用Logistic回归分析。 结合实际情况,可以将Logistic回归分析分为3类: 二元Logistic回归…

今年国内石油需求稳中有升,巡检机器人助力石油行业可持续发展

前言:全球能源市场出现普遍回落趋势,其中石油价格下降近20%,而天然气和煤炭价格更是下跌超过50%。此外,碳酸锂和光伏组件价格也纷纷下降超过50%。这种价格下滑对于全球经济的持续增长,尤其是控制通货膨胀方面&#xff…

CSS 盒子模型(box model)

概念 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:外边距(margin),边框(border),内边距(pad…

高比例清洁能源接入下计及需求响应的配电网重构(matlab代码)

目录 1 主要内容 目标函数 重要约束条件 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的…