unity shader渐变纹理卡通化着色效果

本文介绍了如何在Unity中通过自定义着色器利用渐变纹理来实现类似动画风格的卡通化渲染效果。通过计算法线与光照方向的点乘,结合渐变纹理映射,可以创建出几乎没有明暗过渡的直线条理。此外,还强调了要达到理想的卡通效果,模型和贴图本身也需要遵循卡通风格,避免过多的细节和阴影。文中提供了代码示例,并展示了不同着色器在模型上的应用效果,以进一步说明这种方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时纹理贴图的作用不仅仅是给模型贴上一层“外衣”,一些其他的效果也可以使用贴图来完成,比如使用渐变纹理来使物体有一定的卡通化效果。

回想一下看过的一些动画就可以知道,动画里人物的绘制的明暗区域的过渡非常直接,如下图,可以看到几乎不是纯黑就是纯白。
在这里插入图片描述

那么我们也可以在unity shader中实现大致的效果,主要思路就是制作一张渐变纹理。
然后使用phong光照模型中的漫反射公式,即法线点乘光照方向,来得到一点的亮度信息。此时如果直接使用此亮度信息,就会得到一个过渡十分均匀的效果,那么为了得到动画中几乎没有明暗过渡区域的那种效果,我们需要用亮度值在渐变纹理上做一次映射。

我们使用的渐变纹理如下,此时进行映射,就可以得到诸如亮度值大于多少,都变成一个固定的值,这样就可以得到几乎没有明暗过渡的效果。
在这里插入图片描述

主要代码就是先计算出世界坐标下的法线和光照方向,然后进行点乘。
还要做一个映射,因为单位向量点乘结果范围是[-1,1],而uv坐标范围是[0,1]

 fixed value = dot(worldNormal, worldLightDir)/2+0.5;

最后用这个亮度值在渐变纹理上进行重新映射,再乘上原本的纹理颜色
主要代码基本就是这样,非常的简单

fixed4 col = tex2D(_MainTex, i.uv);
float3 diffuse = tex2D(_RampTex,fixed2(value, value)) * col

完整代码如下

Shader "Test/cartoon"
{
   
   
    Properties
    {
   
   
        _MainTex ("Texture", 2D) = 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值