Unity shader教程-第六课:Ramp Texture

Shader 学习笔记(9) Ramp贴图 // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' Shader "wx/Ramp"{ Properties{ _Color("Color",Color)=(1,1,1,1) _RampTex("Ramp Tex",2D)="white"{} _Specular("Specular",Color)... 阅读详情

本文首发地址:http://98jy.net/article/25

更多文章,请入传送门

----------------------------------------------


Ramp Texture在Valve公司的军团要塞2后开始成为一种控制漫反射的方法。

 

Ramp Texture是类似下图的一张贴图:

 

在一般的Blinn/Phong模型中,我们对漫反射的系数是基于入射光和击中的点的法线的角度。在这种情况下,系数的计算代码大致如下:

float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
    float3 lightDir = lightPos - pos;
    lightDir.normalize();

    return max(0.0, Dot(lightDir, normal));
}

 

使用Ramp texture,可以用一张1D的材质图来做为索引表。用来控制漫反射的系数。虚拟代码如下:

texture1D rampTex;
float DiffuseCoeff(in float3 pos, in float3 normal, in float3 lightPos) {
    float3 lightDir = lightPos - pos;
    lightDir.normalize();

    // Map value from [-1, 1] to [0, 1]
    float rampCoord = Dot(lightDir, normal) * 0.5 + 0.5;
    return tex1D(rampTex, rampCoord);
}

 

我们这节课来改动原来的shader,自己来观察原来的shader在加入Ramp Texture后能做的事情。

 

  • 把原来的BaiscDiffuse代码改成如下

 

	    inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten)
		{
		    float difLight = dot(s.Normal, lightDir);
		    float hLambert = difLight * 0.5 + 0.5;
		    float3 ramp = tex2D(_RampTex, float2(hLambert, hLambert)).rgb;
		    
		    float4 col;
		    col.rgb = s.Albedo * _LightColor0.rgb * (ramp);
		    col.a = s.Alpha;
		    return col;
		}
  • 在Properties中加入

 

_RampTex("Ramp texture", 2D) = "white"

 

 

  • 在SubShader块中加入

 

sampler2D _RampTex;

为了保证你最后的结果跟我的是一样的,这里是最后的代码:

 

 

Shader "myDiffuse"
{
	Properties
	{
		_EmissiveColor ("Emissive Color", Color) = (1, 1, 1, 1)
		_AmbientColor ("Ambient Color", Color) = (1, 1, 1, 1)
		_SomeValue ("Coefficient", Range(0, 10)) = 2.5
		_RampTex("Ramp texture", 2D) = "white"
	}
	
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		#pragma surface surf BasicDiffuse
		
		float4 _EmissiveColor;
		float4 _AmbientColor;
		float _SomeValue;
	    sampler2D _RampTex;
	    
	    inline float4 LightingBasicDiffuse(SurfaceOutput s, fixed3 lightDir, fixed atten)
		{
		    float difLight = dot(s.Normal, lightDir);
		    float hLambert = difLight * 0.5 + 0.5;
		    float3 ramp = tex2D(_RampTex, float2(hLambert, hLambert)).rgb;
		    
		    float4 col;
		    col.rgb = s.Albedo * _LightColor0.rgb * (ramp);
		    col.a = s.Alpha;
		    return col;
		}
		
		struct Input
		{
			float2 uv_MainTex;
		};
		
		void surf (Input IN, inout SurfaceOutput o)
		{
			float4 c = pow((_EmissiveColor + _AmbientColor), _SomeValue);
			
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
  • 保存,然后我们回到unity。

 

选中某个材质球,Inspector面板上会出现选择图片的控件,这里我们可以拖入一张图观察结果。

对那些还不会使用绘图工具的读者,你可以用我这里给你准备好的几张图(ramp texture生成方式可以使用photoshop的gradient工具,附录里我们写了这些步骤)

 

对于Ramp Texture shader来说,我们主要是加入了对送入的Ramp texture的色彩的检索,检索出来的色彩值最后能影响到我们的光照模型的输出。

 

tex2D()方法是cg的库方法,用来根据第二个参数提供的uv值(类型是float2,分别代码水平方向的u和竖直方向的v),来检索第一个参数代表的图档中的RGBA值。

 

这里我们给定的uv值有half lambert的值决定,half lambert越大,意味着我们索引到的像素的值的位置在原图中越是偏向于右下角方向。美术可以利用这个特性来控制一个物体表面的漫反射(越是往右,越是往下,意为着物体的法线方向越来越接近于入射光)。

 

附录:

在Photoshop中,我们可以几个步骤来建立Ramp texture:

 

  • 打开photoshop,新建一张图
  • 选中工具箱中的渐变工具(一般在橡皮擦的下面一个)
  • 然后在图上从左到右拖动一根线出来
  • 结果就得到一张从photoshop中设置的前景色过渡到背景色的图出来了

 

98教育原创,转载请注明出处(98jy.net),否则视为侵权。

02_RampTexture(渐变纹理) 文章:使用RampTexture来控制diffuse shading https://www.cnblogs.com/tekkaman/p/3978942.html 教程 https://subscription.packtpub.com/book/game_development/9781849695084/1/ch01lvl1sec14/creating-a-ramp-texture-to-control-diffuse-shading RampTexture(渐变纹理) 利用Lambert漫反. 阅读详情

相关推荐

Unity-默认渲染管线-刻晴卡渲shader

Unity-默认渲染管线-刻晴卡渲shader

TingQiaoQiao的博客 1804

Unity下的日式卡通渲染实现-着色篇(一)

这篇文章讲述的是项目中二次元日式卡通着色渲染用到的一些跟着色相关的技术点。 一、卡通着色 何谓卡通着色?大概是让角色看起来卡通的角色吧。这里说的卡通着色,实际上指的是色阶着色。即根据光照和法线计算出当前像素处于哪个色阶,色阶直接有平缓过渡。 1.1 三色阶 如下图所示, 这是一个三阶色的着色结果。可以看到着色结果是明显的三阶,从正对光照到背对光照是过渡分明的白色、灰色、黑色的三色阶。卡通渲染着色最基础的部分就是这种明显过渡的色阶。根据需要,项目中可能采用的是二色阶或者三色阶。我们观察过战双的角色效果,猜测

远行's Blog 9222

【Unity Shaders】Diffuse Shading——使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)

终于到了Diffuse Shading一章的最后一篇了!回忆一下,在上一篇中,一共学习了两种改善漫反射光照的方法:一种是完全根据感性认识,使用Half Lembert方法改变了光照值区间,使得物体颜色整体提亮;一种是通过一张渐变图,来控制光照值。 这两种方法都只考虑到了入射光线和反射点所在的平面法向量的夹角,但是想象实际生活中我们观察一个物体,即便是在相同的光照下观察物体的同一点,如果我们观察位

candycat 2万+

【学习】原神材质ShaderGraph实现笔记

本文主要是参考学习了B站大佬的原视频来实现类原神材质,这里主要是自己的心得和笔记。

coldbluer的博客 4720

Unity 卡通渲染 3 种方案对比:Unlit/Texture、UnityToonShader 与 URP Shader Graph

本文深度对比了Unity中三种卡通渲染方案:Unlit/Texture、UnityToonShader与URP Shader Graph,详细解析了各自的技术原理、实现方法及适用场景。从基础无光照方案到高级URP节点编辑,帮助开发者根据项目需求选择最佳卡通渲染方案,提升游戏开发中的视觉表现与性能优化。

cixu3288的博客 445

Unity URP风格化草地渲染:Shader与GPU Instancing性能优化实战

在实时渲染领域,着色器(Shader)是实现视觉风格化的核心技术,它通过编程控制物体表面颜色、光照和几何变形。其原理在于替代固定管线,允许开发者自定义渲染方程,从而在GPU上高效执行。这项技术的核心价值在于能以较低性能开销实现丰富的艺术表现,尤其在移动端和大型开放世界场景中至关重要。常见的应用场景包括卡通渲染、风格化植被以及需要大规模实例化的环境物体。本文聚焦于Unity URP管线下的风格化草地渲染,深入探讨如何结合Shader Graph与HLSL编写风格化着色器,并集成GPU Instancing技术

weixin_34318326的博客 808

【Unity Shader URP】色带渐变着色(Ramp Shading)实战教程

色带渐变着色(Ramp Shading)是最灵活的非真实感光照技巧之一:把 NdotL 当"索引",用一张 1D 渐变贴图查表,让光影过渡完全由美术控制。卡通赛璐珞硬切、冷暖色调渐变、金属质感色带——换张贴图就换一种风格,代码不用动。

Fresh_Free的博客 591

URP中Ramp Shading实现:从原理到实战的卡通渲染指南

在计算机图形学中,光照模型是决定物体外观的核心技术,传统Lambert和Blinn-Phong模型提供连续平滑的光照过渡。其原理基于表面法线与光线方向的点积计算,通过数学映射生成明暗变化。这种技术价值在于能够模拟真实世界的光照行为,广泛应用于游戏开发、影视特效和交互式应用。然而,风格化渲染需求催生了Ramp Shading这类非真实感渲染技术,它通过渐变贴图重新映射光照响应,将连续渐变分解为离散色阶。在Unity的URP渲染管线中,由于架构从Surface Shader转向HLSL手写代码,实现Ramp S

weixin_33965305的博客 382

【Unity URP Shader】崩坏星穹铁道仿渲染 学习记录2

之前已经分析了贴图,对render feature做了一些准备工作,并且对环境光和直接光照都进行了计算。然后对剩下的Ramp、高光、RimLight、Stocking进行计算。仅供记录个人学习过程,侵权即删。内容完全可能有错误,欢迎指正。

2401_88809710的博客 2119

Unity卡通渲染终极指南:从原理到实战的完整Shader实现

卡通渲染(Cel Shading/Toon Shading)是一种非真实感渲染技术,其核心在于将连续的光照计算结果进行离散化处理,形成鲜明的色块效果。这一技术通过改造传统的光照模型,使用渐变纹理或阶跃函数对漫反射强度进行重映射,从而实现从物理光照到风格化表现的转换。在工程实践中,卡通渲染的价值在于能够高效地营造独特的视觉风格,广泛应用于动漫风格游戏、影视动画及各类需要艺术化表现的交互内容中。其关键技术组件包括基于几何外壳或后处理的轮廓线生成、量化高光与风格化边缘光等。本文聚焦于Unity引擎中的卡通着色器实

weixin_33672109的博客 359

Unity二次元角色渲染进阶:从NPR原理到《星穹铁道》风格Shader实战

非真实感渲染(NPR)是计算机图形学中用于模拟艺术化风格的关键技术,其核心在于通过特定的光照模型和渲染管线,舍弃物理准确性以追求风格化的视觉表达。在实时渲染领域,NPR技术常被用于实现卡通、水墨等风格,其技术价值在于能够高效地塑造独特的视觉语言,增强作品的艺术表现力与辨识度。该技术广泛应用于游戏角色渲染、动画制作及独立游戏开发等场景。本文聚焦于二次元卡通渲染这一热门应用方向,深入探讨了如何通过自定义Shader在Unity的URP(通用渲染管线)中实现类似《崩坏:星穹铁道》的高级渲染效果,其中涉及**阶调纹

chutisun0039的博客 407

GenshinCelShaderURP实战教程:Nilou模型卡通渲染效果实现步骤详解

GenshinCelShaderURP是一个基于URP的开源仿原神卡通渲染项目,旨在帮助开发者快速实现高质量的卡通风格角色渲染效果。本教程将以Nilou模型为例,详细介绍如何使用该项目实现专业级的卡通渲染效果。 ## 准备工作:项目环境搭建 ### 1. 项目获取与安装 首先需要获取项目源码,通过以下命令克隆仓库: ``` git clone https://gitcode.com/gh_mi

gitblog_00945的博客 1011

Unity卡通渲染核心:Toon Shader原理与URP实战指南

在计算机图形学中,着色器(Shader)是控制3D模型表面外观的核心程序,它定义了光线与材质交互的视觉表现。其基本原理是通过顶点和片元着色阶段,对模型的几何、纹理、光照信息进行数学计算与处理。在风格化渲染领域,非真实感渲染(NPR)技术旨在突破物理真实的限制,创造如手绘般的艺术效果,这构成了Toon Shader的技术基石。Toon Shader的核心技术价值在于,它通过程序化手段,将连续的光照计算结果进行离散化处理,例如使用阶跃函数或Ramp贴图来生成分明的色块阴影,从而模拟出2D动画的视觉特征。这种技术

weixin_30457465的博客 496

PrimoToon入门教程:5分钟快速上手《原神》风格Shader

PrimoToon是一款专为Unity内置渲染管线开发的Shader工具,旨在帮助开发者快速实现《原神》风格的卡通渲染效果。本教程将带你在5分钟内完成从环境搭建到效果调试的全过程,让你的3D模型瞬间拥有米哈游式的二次元美感✨ ## 准备工作:1分钟环境配置 首先确保你的开发环境满足以下要求: - Unity 2019.4 LTS或更高版本(内置渲染管线) - Git工具(用于获取项目源码)

gitblog_00903的博客 878

Unity Shader 渐变纹理

纹理其实可以用于存储任何表面属性。一种常见的用法就是使用渐变纹理来控制漫反射光照的结果。 Shader "MyShader/RampTexture" { Properties { _Color("Color Tint",Color) = (1,1,1,1) _RampTex("Ramp Tex",2D) = "white"{} ...

songhuanfei2017的博客 1063

【RTOS】 Vxworks 653 第一章 —— 初识 vx653 3.x

。。不是很重要,自己搜吧鲁棒分区是一种确保共享计算资源中独立运行功能实现​​时空隔离​​的机制,其目标是为集成模块中的混合临界性应用提供与联邦式部署(federated implementation)同等级别的功能隔离保障。具体表现为:​​多关键性共存​​:支持不同安全等级应用(如飞控系统A级与娱乐系统D级)在同一模块中协同运行。​​抗干扰能力​​:防止未授权或意外的时空干扰(如内存越界、时间窗口冲突),确保应用间互不影响。​​。

qq_38183694的博客 1280

Unity特效进阶:用Ramp贴图高效模拟薄膜干涉流光效果

在实时渲染领域,纹理采样是连接艺术表现与程序逻辑的核心技术之一。Ramp贴图作为一种一维渐变纹理,其原理是通过一个标量输入值(UV的U坐标)快速查找并输出对应的颜色值,将复杂的颜色计算简化为一次高效的纹理采样操作。这项技术的核心价值在于,它完美地解耦了视觉效果与底层计算逻辑,使美术人员能够通过直接编辑贴图来自由控制色彩表现,而程序员则专注于设计驱动采样的参数因子。在游戏特效、角色技能和场景氛围营造等应用场景中,这种方案能以极低的性能开销,实现诸如能量护盾、武器光效和奇幻材质表面等需要丰富色彩动态变化的视觉效

weixin_34327761的博客 423

【MUJOCO控制篇-2】控制一个简单的机械臂

本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。

echo_Fangyb的博客 6748

Unity URP卡通角色渲染实战:从Shader编写到性能优化

卡通渲染作为非真实感渲染(NPR)的重要分支,通过简化和风格化的视觉表达,在游戏和动画领域广泛应用。其核心原理在于对传统物理光照模型进行重构,使用色阶贴图(Ramp Texture)离散化光照计算,并结合几何挤出法生成轮廓线,以实现鲜明的色块和硬边过渡效果。这种技术不仅能够塑造独特的艺术风格,还能在移动端等性能受限平台上保持高效运行。在Unity的通用渲染管线(URP)框架下,开发者可以通过编写自定义Shader,将卡通渲染的固有色、光影和轮廓三大要素系统整合,构建出标准化、可跨平台适配的角色材质流程。本文

weixin_30615767的博客 332

从零到一:高通Memory QMVS测试环境搭建的避坑指南

本文详细介绍了高通Memory QMVS测试环境搭建的全流程避坑指南,涵盖硬件选择、软件配置、QMVS核心组件安装及测试执行技巧。重点解析了adb工具配置、QPST日志抓取等关键步骤,帮助工程师高效搭建稳定测试环境,避免常见兼容性和稳定性问题。

weixin_29251567的博客 555

linux离线安装nginx

linux离线安装nginx

zhang_130914036的博客 9347

Unity Shader 实战:从零打造 NPR 卡通角色渲染

NPR(非真实感渲染)是一种追求艺术化效果的计算机图形渲染技术,与追求真实感的PBR渲染相对。文章详细介绍了NPR渲染的核心特征(硬阴影、描边、色块化高光等)及其在游戏中的典型应用(如《原神》《塞尔达传说》)。重点讲解了NPR渲染的技术架构和实现方法,包括赛璐璐阴影、卡通高光、边缘光、SDF面部阴影和描边Pass等核心模块的实现原理。文章还提供了参数调优指南和进阶方向建议,为开发者实现风格化角色渲染提供了完整的技术路线。

mxwin的博客 1383

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+
上一篇: Unity shader教程-第五课:自定义光照模型之Half Lambert模型
下一篇: UnrealEngine4(虚幻4)这次来真格的了
TinyHum
博客等级 码龄15年 76粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值