当前位置: 首页 > news >正文

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

罪恶装备背德之炎卡通角色_二次元风格_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 100Pass{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 100Pass{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 FrontCGPROGRAM#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)

相关文章:

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

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果:基础渲染SimpleBas 资源分析模型顶点颜色: 贴图资源SOL_base_基础色块效果:其中SOL_base_A通道的效果: SOL_ilm:如下SOL_ilm模型上区域分布- 左到右…...

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具,该软件采用了智能技术,以解决影响所有RAW文件的七个问题:去马赛克,降噪,波纹,变形,色差,不想要的渐晕,以及缺乏清晰度。 Dx…...

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1:安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2:查询显…...

WordPress主题开发( 十四)之—— 主题开发示例

要深入了解WordPress主题开发的最佳实践和标准,参考主题示例是一种非常有效的方法。在这里,我们将介绍两个主题示例:默认的Twenty主题和Underscores主题,它们都是出色的学习资源。 默认“Twenty”主题 自WordPress 3.0版本开始&a…...

rust学习-any中的downcast和downcast_ref

背景 看rust官方文档,好奇Any和Go的Any是否是一回事,看到下文的一行代码,了解下它的功能 pub trait Any: static {// Required methodfn type_id(&self) -> TypeId; }std::any 用于 dynamic typing 或者 type reflection 模拟动态类型的trait。 大多数类型都实现 …...

js检测数据类型总结

目录 一、typeof 二、instanceof 三、constructor 四、Object.prototype.toString.call() Object.prototype.toString.call(obj)类型检测原理 五、__proto__ 六、 其他 一、typeof typeof在对值类型number、string、boolean 、symbol、 undefined、 function的反应是精准…...

获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈

第六届(2023)全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中,AidLux是广和通5G智能物联网赛题的唯一软件支持,阿加犀为该赛题学生们提供了全程线上辅导、技术答疑,以及大赛专…...

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用,本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解,建议您先进行了解后再阅读本篇,可以参考: Mybatis 二级缓存https://blog.csd…...

VMware vSphere ESXI 6.7 U3封装RTL8125B网卡驱动

之前的教程VMware vSphere ESXI 6.7 U3最新版本封装网卡驱动补丁可参考,本文为此文章的又一次实践 准备工作 1、ESXi-Customizer-PS-v2.6.0.ps1 (官网下载,Github下载) 2、ESXi670-202210001.zip (VMware vSphere Hy…...

黑马JVM总结(二十五)

(1)字节码指令-cinit 构造方法可以分为两类,一类是cinit 一类init cinit是整个类的构造方法 putstatic:进行static变量的赋值,是到常量池里找到名字一个叫做i的变量 (2)字节码指令-init in…...

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。(我更新博文的顺序一般是按照我当前的学习进度来安排,学到什么就更新什么(简单来说就是我的学习笔记),所以不会对一个专栏一下子更新到底,哈哈哈哈哈哈哈!&a…...

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Java 21 新特性:Unnamed Classes and Instance Main Methods

Java 21引入了两个语言核心功能: 未命名的Java类你说新的启动协议:该协议允许更简单地运行Java类,并且无需太多样板 下面一起来看个例子。通常,我们初学Java的时候,都会写类似下面这样的 Hello World 程序&#xff1…...

Tomcat启动后的日志输出为乱码

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

CSP-J第二轮试题-2021年-4题

文章目录 参考:总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案答案1答案2答案3 现场真题注意事项 参考: https://www.luogu.com.cn/probl…...

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…...

P1540 [NOIP2010 提高组] 机器翻译(模拟)

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…...

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

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

二分答案(求最大值的最小值||求最小值的最大值)

引入 二分答案要建立在二分查找的基础上&#xff0c;在此之前&#xff0c;要知道二分查找的三个模板 模板一 while(l<r) {int mid(lr)>>1;if(check(mid)) rmid;else lmid1; }模板二 while(l<r) {int midlr1>>1;if(check(mid)) lmid;else rmid-1; }模板三…...

思维模型 周期

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。周期是一个看似极为简单&#xff0c;但背后却蕴藏着大智慧的模型&#xff0c;了解周期&#xff0c;对于了解王朝更替&#xff0c;数学之美&#xff0c;经济运转等都有帮助。 1 周期的应用 …...

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

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

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…...

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…...

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…...

喝健康白酒 有益生心健康

中国的制酒史源远流长&#xff0c;酒渗透在中华五千年的文化中。酒与烟不同&#xff0c;烟对人体有百害而无一利&#xff0c;而对于酒&#xff0c;若掌握好饮酒的度&#xff0c;对人体有一定的养生作用&#xff0c;所以我们通常会说“戒烟限酒”。 据一些专家研究&#xff0c;…...

动态规划:两个数组的dp问题(C++)

动态规划&#xff1a;两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列&#xff08;中等&#xff09;2.不同的子序列&#xff08;困难&#xff09;3.通配符匹配&#xff08;困难&#xff09;4.正则表达式&#xff08;困难&#xff09;5.交错字符串&#xff08;中等&…...

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…...

【图论C++】Floyd算法(多源最短路径长 及 完整路径)

>>>竞赛算法 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在算法竞赛学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff…...

小谈设计模式(11)—模板方法模式

小谈设计模式&#xff08;11&#xff09;—模板方法模式 专栏介绍专栏地址专栏介绍 模板方法模式角色分类抽象类&#xff08;Abstract Class&#xff09;具体子类&#xff08;Concrete Class&#xff09;抽象方法&#xff08;Abstract Method&#xff09;具体方法&#xff08;C…...

C#程序中很多ntdll.dll、clr.dll的线程

如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。...

wordpress third主题/最权威的排行榜网站

1、谈理想&#xff1a;希望公司对人类社会进步有贡献 我们希望阿里巴巴是这么一家公司&#xff0c;希望在中国这个土地上诞生一家对世界经济发展、人类社会进步有贡献的公司。所以我们希望招聘进来的员工&#xff0c;大家都充满这个使命&#xff0c;大家都充满着这个理想&…...

渭南网站建设wifi/网站搭建源码

GNU&Linux&Unix&GPL&Ubuntu介绍 1、GNU GNU是一种自由的操作系统&#xff0c;内容软件以GPL方式发布&#xff0c;该操作系统是GNU项目的主要目的。是GNUs Not Unix&#xff01;的递归缩写。设计类似Unix&#xff0c;但是不包含Unix中著作权代码。该项目由 理…...

成都公司网站建设/实体店营销策划方案

1.保存整个网络结构信息和模型参数信息: torch.save(model_object, ./model.pth) 直接加载即可使用&#xff1a; model torch.load(./model.pth) 2.只保存网络的模型参数-推荐使用 torch.save(model_object.state_dict(), ./params.pth) 加载则要先从本地网络模块导入网络&…...

做网购网站要多少钱/seo刷点击软件

前言前两天在 echarts 上寻找灵感的时候&#xff0c;看到了很多有关地图类似的例子&#xff0c;地图定位等等&#xff0c;但是好像就是没有地铁线路图&#xff0c;就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo&#xff0c;地铁线路上的点是在网上随便下载了一个&a…...

wordpress采集建站/百度快照怎么发布

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;关于Hadoop的单机和伪分布式配置参见&#xff1a;http://my.oschina.net/unclegeek/blog/40042&#xff09;当写这篇文章的时候&#xff0c;最新版的hadoop是1.0.1版本&#xff0c;支持了许多新的特性&#…...

wordpress 移动主题 crystal/合肥网站排名

2019独角兽企业重金招聘Python工程师标准>>> 1、基础知识 1.1、数据库概述 简单地说&#xff1a;数据库&#xff08;Database或DB&#xff09;是存储、管理数据的容器&#xff1b;严格地说&#xff1a;数据库是“按照某种数据结构对数据进行组织、存储和管理的容器”…...