【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

news2024/12/22 14:46:02

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染

    • 角色初始效果:
      • 基础渲染SimpleBas
    • 资源分析
      • 模型
        • 顶点颜色:
      • 贴图资源
        • SOL_base_基础色块效果:
          • 其中SOL_base_A通道的效果:
        • SOL_ilm:如下
          • SOL_ilm模型上区域分布
          • - 左到右,依次为RGBA。
        • SOL_Sss:如下
          • SOL_ilm在模型上的效果
    • 优化
        • 优化前全身图
        • 优化后全身图
        • 面部对比图
        • 腰带和手臂描边对比图
        • 对比图
      • 卡渲代码
      • 卡渲参考链接:

在这里插入图片描述

角色初始效果:

在这里插入图片描述

基础渲染SimpleBas

Shader "SimpleBase"
{
    Properties
    {
        [Header(BaseColor)]
        _MainTex ("BaseTex", 2D) = "white" {}
        [Space(20)]
        [Header(ILM)]
        _ILMTex("ILMTex",2D) = "white"{}
        [Space(20)]
        [Header(SSS)]
        _SssTex("SssTex",2D) = "white"{}
        [Space(20)]
        [Header(Detail)]
        _DetailTex("DetailTex",2D) = "white"{}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
                float4 tangent :TEXCOORD2;
                half3 normal : NORMAL;
                half4 color : COLOR;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                half4 vertexColor : TEXCOORD1;
                half3 worldNormal : TEXCOORD2;
                float3 worldPos : TEXCOORD3;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _ILMTex;
            sampler2D _SssTex;
            sampler2D _DetailTex;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv.xy = TRANSFORM_TEX(v.uv0, _MainTex);
                o.uv.zw = v.uv1;
                o.vertexColor = v.color;
                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 ilm = tex2D(_ILMTex,i.uv.xy);
                fixed4 baseColor = tex2D(_MainTex, i.uv.xy);
                fixed4 sssColor = tex2D(_SssTex,i.uv.xy);
                fixed3 detail = tex2D(_DetailTex,i.uv.zw);
                half ao = saturate((i.vertexColor.r - 0.7) * 50);
                half3 worldNormal = normalize(i.worldNormal);
                half3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                half3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                half3 halfDir = normalize(worldLightDir + worldViewDir);
                half NdotH = saturate(dot(halfDir,worldNormal));
                half NdotL = dot(worldLightDir,worldNormal);
                half sssFactor = saturate((NdotL * 0.5 + 0.5 - i.vertexColor.b * 0.5) * 50) * ao;
                fixed4 finalColor = 1;
                finalColor.rgb = lerp(sssColor,baseColor,sssFactor) * detail * ilm.a;
                return finalColor;
            }
            ENDCG
        }
    }
}

资源分析

模型

顶点颜色:

模型的B通道灰色
在这里插入图片描述

贴图资源

在这里插入图片描述

SOL_base_基础色块效果:

在这里插入图片描述

其中SOL_base_A通道的效果:

在这里插入图片描述

  • 其中A通道,是将人物身上的文字图案区域 描黑。
SOL_ilm:如下

在这里插入图片描述

SOL_ilm模型上区域分布

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

- 左到右,依次为RGBA。
  • R通道:控制整体的高光强度。

  • G通道:控制NdotL光照的偏移值,例如褶皱。

  • B通道:控制高光的大小、范围或者形状。

  • A通道:人物模型的内描线。

  • 顶点颜色:

  • R通道:AO,也是控制NdotL光照偏移。

SOL_Sss:如下

在这里插入图片描述

SOL_ilm在模型上的效果

在这里插入图片描述

SSSTexture的值与环境光的颜色相乘得到的颜色来决定阴影颜色。
明部主光颜色
暗部
环境光颜色

优化

优化前全身图

在这里插入图片描述

优化后全身图

在这里插入图片描述

面部对比图

在这里插入图片描述

腰带和手臂描边对比图

在这里插入图片描述

对比图

请添加图片描述

卡渲代码

Shader "SOL"
{
    Properties
    {
        [Header(BaseColor)]
        _MainTex ("BaseTex", 2D) = "white" {}
        [Space(20)]
        [Header(ILM)]
        _ILMTex("ILMTex",2D) = "gray"{}
        [Space(20)]
        [Header(SSS)]
        _SssTex("SssTex",2D) = "black"{}
        [Space(20)]
        [Header(Detail)]
        _DetailTex("DetailTex",2D) = "white"{}
        _ToonThreshold("ToonThreshold",Range(0,1)) = 0.5
        _ToonHardness("ToonHardness",Float) = 20.0
        _SpecColor("spec color", Color) = (1,1,1,1)
        _SpecSize("Spec Size",Range(0,1)) = 1
        [Space(20)]
        [Header(OutLine)]
        _OutlineColor("Outline Color", Color) = (0,0,0,0)
        _Outlinewidth("Outline Width",Range(0,1)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        Pass
        {
            Tags{"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"
            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
                half3 normal : NORMAL;
                half4 color : COLOR;
            };

            struct v2f
            {
                float4 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                half4 vertexColor : TEXCOORD1;
                half3 worldNormal : TEXCOORD2;
                float3 worldPos : TEXCOORD3;
            };

            sampler2D _MainTex;
            sampler2D _ILMTex;
            sampler2D _SssTex;
            sampler2D _DetailTex;

            half _ToonThreshold;
            half _ToonHardness;
            half _SpecSize;

            //没有定义"float4 _SpecColor" 是因为在#include "UnityLightingCommon.cginc"文件里已经被声明。
            // float4 _SpecColor;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = float4 (v.uv0,v.uv1);
                o.vertexColor = v.color;
                o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
                o.worldNormal = mul(v.normal,(float3x3)unity_WorldToObject);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half2 uv1 = i.uv.xy;
                half2 uv2 = i.uv.zw;
                //贴图采样、亮部和暗部的颜色、控制高光的强度
                fixed4 ilm = tex2D(_ILMTex,i.uv.xy);
                half spec_intensity = ilm.r;//控制高光强度
                half diffuse_control = ilm.g * 2.0 - 1.0;//光照偏移
                half spec_size = ilm.b;//控制高光形状
                half inner_line = ilm.a;//内描线
                fixed4 baseColor = tex2D(_MainTex, i.uv.xy);//亮部的颜色
                fixed4 sssColor = tex2D(_SssTex,i.uv.xy);//暗部的颜色
                fixed3 detail = tex2D(_DetailTex,i.uv.zw);//细节线条
                //顶点处理
                half ao = saturate((i.vertexColor.r - 0.7) * 50);
                //向量
                half3 worldNormal = normalize(i.worldNormal);
                half3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                half3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));
                //漫反射
                half NdotL = dot(worldLightDir,worldNormal);
                half halflambert = (NdotL + 1.0) * 0.5;
                half lambertterm = halflambert * ao + diffuse_control;
                half toondiffuse = saturate ((lambertterm - _ToonThreshold) * _ToonHardness);
                half3 finaldiffuse  = lerp(sssColor ,baseColor,toondiffuse);

                //高光
                float NdotV = (dot(worldNormal,worldViewDir) + 1.0) * 0.5;
                float spec_term = NdotV * ao + diffuse_control;
                spec_term = halflambert * 0.9 + spec_term * 0.1;
                half toon_spec = saturate((spec_term - (1.0 - spec_size * _SpecSize)) * 500);
                half3 speccolor = (_SpecColor.xyz + baseColor) * 0.5;
                half3 finaspec = toon_spec * speccolor * spec_intensity;

                //描线
                half3 inner_line_Color = lerp(baseColor * 0.2 , float3(1.0,1.0,1.0),inner_line);
                half3 ditailcolor = tex2D(_DetailTex , uv2);
                ditailcolor = lerp(baseColor * 0.2, float3(1.0,1.0,1.0),ditailcolor);
                half3 finalline = inner_line_Color * inner_line_Color * ditailcolor;

                fixed3 finalColor = (finaldiffuse + finaspec) * finalline;
                return float4(finalColor,1.0);
            }
            ENDCG
        }
        Pass
        {
            Cull Front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv0 : TEXCOORD0;
                half3 normal : NORMAL;
                half4 color : COLOR;
            };
            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                half4 vertexColor : TEXCOORD1;
                half3 worldNormal : TEXCOORD2;
                float3 worldPos : TEXCOORD3;
            };
            sampler2D _MainTex;
            float4 _OutlineColor;
            float _Outlinewidth;

            v2f vert (appdata v)
            {
                v2f o;
                float3 pos_VS = UnityObjectToViewPos(v.vertex);
                float3 normal_WS = UnityObjectToWorldNormal(v.normal);
                float3 outline_dir = normalize(mul((float3x3)UNITY_MATRIX_V,normal_WS));
                o.vertexColor = v.color;
                pos_VS += outline_dir * _Outlinewidth * 0.001 * v.color.a;
                o.pos = mul(UNITY_MATRIX_P,float4(pos_VS,1.0));
                o.uv = v.uv0;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 baseColor = tex2D(_MainTex, i.uv.xy).xyz;
                half maxComponent = max(max(baseColor.r,baseColor.g),baseColor.b) - 0.004;
                half3 saturatedColor = step(maxComponent.rrr,baseColor) * baseColor;
                saturatedColor = lerp(baseColor.rgb,saturatedColor,0.6);
                half3 outlineColor = 0.8 * saturatedColor * baseColor * _OutlineColor.xyz;
                return float4(outlineColor,1.0);
            }
            ENDCG
        }
    }
}

卡渲参考链接:

西川善司:【纯卡通动画的实时3D图形】的秘密
【翻译】西川善司「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,前篇(1)

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

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

相关文章

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库,自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例,顶部状态栏高度为20 左侧类似于标尺,因为图标、文字离最左侧的间距是不一样的 信…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环,用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息,实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

C++-哈希Hash

本期我们来学习哈希 目录 unordered系列关联式容器 unordered_map unordered_set 性能比较 哈希概念 哈希冲突 哈希函数 哈希冲突解决 闭散列 模拟实现 开散列 模拟实现 全部代码 unordered系列关联式容器 在 C98 中, STL 提供了底层为红黑树结构的一…

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG:dbms failed to start 二、CQL语法2.1 CQL语法2.2 习题 习题答案 序 知识图谱,是一种实体间的信息与关系知识的网状结构,借用图论中点与边的概念进行组建,易于结构化和…

生信教程:ABBA-BABA分析之滑动窗口

简介 ABBA BABA 统计(也称为 D 统计)为偏离严格的分叉进化历史提供了简单而有力的检验。因此,它们经常用于使用基因组规模的 SNP 数据测试基因渗入。 虽然最初开发用于基因渗入的全基因组测试,但它们也可以应用于较小的窗口&#…

Qt地铁智慧换乘系统浅学(四 )实现添加线路,添加站点,添加边 并且存储到本地txt文件

玩的就是添加 添加前的构思界面设计tabWidget添加线路界面添加站点界面添加边界面 代码实现添加线路思路连接槽函数槽函数 添加站点思路连接槽函数初始化combox槽函数更新容器函数 添加边思路槽函数 和代码 注意 添加前的构思 假设 现要添加一个线路 : 9号线 如果…

[H5动画制作系列 ]帧代码运行顺序测试

刚开始接触Animate CC(过去叫:Flash),对于帧代码的执行顺序十分迷惑。所以,专门做一个简单代码顺序测试. 准备工作: 代码图层actions,第1帧和第10帧为关键帧。 背景图层bg,就一个字符串红色Test.界面如下: 代码测试步…

八个不可不知的SQL高级方法

结构化查询语言(SQL)是一种广泛使用的工具,用于管理和操作数据库。基本的SQL查询简单易学,但掌握高级SQL技术可以将您的数据分析和管理能力提升到新的高度。 高级SQL技术是指一系列功能和函数,使您能够对数据执行复杂…

Zero-Shot Learning by Harnessing Adversarial Samples 理论 代码解读

《Zero-Shot Learning by Harnessing Adversarial Samples》基于对抗样本的零样本学习 该论文要解决的问题: 减轻了传统图像增强技术中固有的语义失真问题。我们希望我们的实验研究将有助于理解单标签监督和语义属性监督在模型行为上的差异,并为开发更…

10.01

服务器 #include<myhead.h> //键盘输入事件 int keybord_events(fd_set readfds) {char buf[128] "";int sndfd -1; //从终端获取一个文件描述符&#xff0c;发送数据给该文件描述符对应的客户端bzero(buf, sizeof(buf));int res scanf("…

Junit的常用操作

注:本篇文章讲解的是junit5 目录 Juint是什么 Juint需要导入的依赖 Juint常用注解 Junit执行顺序 参数化 断言 测试套件 Juint是什么 Juint 是 Java 的一个单元测试框架. 也是回归测试框架. 使用 Junit 能让我们快速的完成单元测试。 注意&#xff1a;Junit 测试也是程序…

网络安全渗透测试工具之skipfish

网络安全渗透测试工具skipfish介绍 在数字化的时代,Web 应用程序安全成为了首要任务。想象一下,您是一位勇敢的安全冒险家,迎接着那些隐藏在 Web 应用程序中的未知风险。而在这个冒险之旅中,您需要一款强大的工具来帮助您发现漏洞,揭示弱点。而这个工具就是 Skipfish。 …

【Android】安卓手机系统内置应用安装失败解决方案

现有的闲置手机有个内置app可老旧了&#xff0c;没有开发者维护&#xff0c;于是问题不断&#xff0c;影响了体验&#xff0c;后来在网上查找发现有它的新版本&#xff0c;想要更新却没有自动更新&#xff08;后台服务断开了&#xff09;&#xff0c;有类似的想法可以来这里了解…

国庆创作周 组播《第十二课》

国庆创作周《第十二课》图解

实现单行/多行文本溢出

在日常开发展示页面&#xff0c;如果一段文本的数量过长&#xff0c;受制于元素宽度的因素&#xff0c;有可能不能完全显示&#xff0c;为了提高用户的使用体验&#xff0c;这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示&#xff0c;超出…

Blued引流脚本

于多数人来说&#xff0c;引流都是一个比较困难的操作&#xff0c;因为流量不会听你的。所以任何人在网上做生意&#xff0c;或者开一个实体店&#xff0c;都会为流量而发愁&#xff0c;其实对于流量的吸引来说&#xff0c;我们越是刻意为之&#xff0c;可能所获得的效果也越不…

基于Java的在线听歌平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录 一、消息队列是什么&#xff1f;二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么&#xff1f; 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…

国庆作业2

select实现服务器并发 代码&#xff1a; #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…

格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断(Python代码,CNN模型)

1.运行效果&#xff1a;格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断&#xff08;Python代码&#xff0c;CNN模型&#xff09;_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提…