方法一:使用顶点颜色实现

建模的时候和模型师沟通一下,让他们把需要膨胀的部分的顶点颜色设置为指定的颜色,然后我们再shader里面获取到之后,在统一处理

注意:我们对于顶点的处理只能写在顶点着色器里面

A.顶点颜色获取

            struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;float4 texcoord : TEXCOORD0;float4 vertColor:COLOR;};

vertColor:COLOR 此属性就是我们从建模软件中传入的顶点颜色,在shader的入口构造函数中可以获取此值,然后根据颜色的深度值来膨胀顶点

B.算法

                v.vertex.xyz += v.normal*_Scale*abs(1-v.vertColor.r);if(v.vertColor.x<1){float z = (1 - v.vertColor.r);v.vertex.xyz += v.normal*(pow(z,_Scale)-1);}

这段代码主要是获取顶点颜色之后膨胀顶点,从而达到实现固定位置膨胀的效果

思路二:使用顶点坐标加上算法实现

此算法无需顶点颜色,直接通过顶点坐标来实现,更加平滑,但是没有顶点颜色实现的细节

核心算法:

            v2f vert (appdata v){v2f o;//y的偏移值float y = sin(v.vertex.y-_YHeight);//x的偏移值float x = sin(v.vertex.x-_XHeight);float target =  x*y;if(target<0){target=0;}//跟进xy的偏移值实现顶点的缩放v.vertex.xyz +=v.normal*target*_Scale;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.projPos = ComputeScreenPos (o.pos);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);#ifdef LIGHTMAP_OFFfloat3 shLight = ShadeSH9(float4(v.normal, 1.0));o.vertexLight = shLight;
#ifdef VERTEXLIGHT_ONfloat3 vertexLight = Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,unity_4LightAtten0, o.worldPos, o.worldNormal);o.vertexLight += vertexLight;
#endif
#endifTRANSFER_SHADOW(o);//仅仅是阴影return o;}

主要实现的目标是划定区域(xyz坐标)实现区域的顶点的膨胀效果

最终实现的膨胀效果以及可调节的参数如下:

完整shader:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "MyShader/PigShader"
{Properties{_Color ("Color", Color) = (1,1,1,1)   _Diffuse("diffuse",Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {} _Specular("specular",Color) = (1,1,1,1)_Gloss("gloss",Range(0,2)) = 0.6_DepthColor ("DepthColor", Color) = (1,1,1,1)   _YHeight("YHeight",float) = 1_XHeight("XHeight",float) = 1_Scale("Scale",float) = 1_Range("Range",Range(-1,1)) = 0}SubShader{Tags { "RenderType" = "Opaque" }LOD 100Pass//ForwardBase{Tags{"LightMode"="ForwardBase"}CGPROGRAM
// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct appdata members vertColor)#pragma exclude_renderers d3d11#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;fixed4 _DepthColor;fixed4 _Color;float _YHeight;float _XHeight;sampler2D _MainTex;float4 _MainTex_ST;float _Scale;float _Range;struct appdata{float4 vertex : POSITION;float3 normal:NORMAL;float4 texcoord : TEXCOORD0;float4 vertColor:COLOR;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal:TEXCOORD0;float3 worldPos:TEXCOORD1;float3 vertexLight : TEXCOORD2;float4 projPos:TEXCOORD3;float2 uv : TEXCOORD4;float4 Color:COLOR;SHADOW_COORDS(5)//仅仅是阴影};v2f vert (appdata v){v2f o;float y = sin(v.vertex.y-_YHeight);float x = sin(v.vertex.x-_XHeight);float target =  x*y;if(target<0){target=0;}v.vertex.xyz +=v.normal*target*_Scale;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.projPos = ComputeScreenPos (o.pos);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);#ifdef LIGHTMAP_OFFfloat3 shLight = ShadeSH9(float4(v.normal, 1.0));o.vertexLight = shLight;
#ifdef VERTEXLIGHT_ONfloat3 vertexLight = Shade4PointLights(unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,unity_4LightAtten0, o.worldPos, o.worldNormal);o.vertexLight += vertexLight;
#endif
#endifTRANSFER_SHADOW(o);//仅仅是阴影return o;}fixed4 frag (v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;float3 worldNormal = normalize(i.worldNormal);float3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed4 albedo = tex2D(_MainTex, i.uv);  float diff = max(0,dot(worldLightDir,worldNormal));//半漫反射系数diff = diff * 0.5 + _Gloss;//这个函数计算包含了光照衰减以及阴影,因为ForwardBase逐像素光源一般是方向光,衰减为1,atten在这里实际是阴影值UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);float3 diffcolor = diff * albedo.rgb*atten;//最终颜色float4 color = float4((diffcolor + ambient) * _Color,_DepthColor.a)*atten;fixed4 endcolor = float4((diffcolor + ambient) * _DepthColor,_DepthColor.a)*atten;fixed s = sin(i.worldPos.y/100);fixed3 fincolor = lerp(endcolor.rgb,color.rgb, s); return float4(fincolor,1);}ENDCG}Pass//产生阴影的通道(物体透明也产生阴影){Tags { "LightMode" = "ShadowCaster" }CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#pragma multi_compile_shadowcaster#pragma multi_compile_instancing // allow instanced shadow pass for most of the shaders#include "UnityCG.cginc"struct v2f {V2F_SHADOW_CASTER;UNITY_VERTEX_OUTPUT_STEREO};v2f vert(appdata_base v){v2f o;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)return o;}float4 frag(v2f i) : SV_Target{SHADOW_CASTER_FRAGMENT(i)}ENDCG}}
}

UnityShader学习教程之<顶点膨胀效果 局部变胖实现思路>相关推荐

  1. UnityShader学习教程之<矩阵的左乘还是右乘所导致的效果问题>

    总结:矩阵的左乘还是右乘 首先,在<3d数学基础:图形与游戏开发>一书的第七章矩阵的7.1.7节中讲到了关于矩阵和向量的乘法问题.结论是"行向量左乘矩阵时,结果是行向量,列向量右 ...

  2. 写给 Web 开发者的深度学习教程 - 向量化 矩阵

    前言 在这个科技发展日新月异的时代,行业的宠儿与弃儿就如同手掌的两面,只需轻轻一翻,从业者的境遇便会有天翻地覆的改变. 人工智能作为近两年来业界公认的热门领域,不同于之前火热的移动端开发或前端开发,其 ...

  3. UnityShader学习教程之<详解uv坐标,c#类似uv坐标的值以及贴图操作>

    基础篇(五) 一.uv坐标 工作的时候一直都听到同事们再说uv坐标,其实我们对这个词很熟悉,但是说到真正是什么,却发现自己了解的并不透彻,写一篇博客,梳理下基础,了解uv到底是干嘛的! 1.uv是什么 ...

  4. UnityShader学习教程之<毛玻璃效果解析>

    毛玻璃是很多项目需要的效果,以下是毛玻璃的效果代码: Shader "Custom/WaterBlur" { Properties { _blurSizeXY("Blur ...

  5. 终极版Python学习教程:一篇文章讲清楚Python虚拟环境

    我在之前写过一篇Python学习教程,说过新手往往没有注意环境隔离,导致Python项目包与包之间冲突. 并且Python2与3代码执行有问题等等.鉴于此我决定今天的Python学习教程给大家聊聊关于 ...

  6. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  7. proteus学习教程大全

    proteus学习教程大全 proteus学习资源大全,热衷于分享资料,资源共享,这个proteus也是收集了很久的资料,一直以来学习嵌入式就很枯燥,幸好有一起能够学习和资源共享的小伙伴共同交流技术上 ...

  8. 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

  9. LaTeX中文学习教程 笔记

    视频地址: LaTeX中文学习教程(用于论文或稿件排版,15集全) 用LaTeX写期刊论文的详细教程 一.基本结构 % 导言区 \documentclass{article}%book,article ...

最新文章

  1. 最近做手机端,GPS,微信QQ分享总结的问题
  2. JavaWeb(二)——Http协议
  3. java actor和线程有什么区别_Scala Actor与java并发编程的区别
  4. BluePrint和ORM
  5. Java购物车swing_JAVA课程设计--购物车
  6. 使用faker生成测试数据
  7. 谁顶住双11的世界级流量洪峰?神龙架构负责人等9位大牛现场拆解阿里秘籍
  8. MyBatis注解-动态SQL 一个 SqlProvider的demo
  9. Linux中bond的七种网卡绑定模式详解
  10. Android性能优化—TraceView的使用
  11. 谷歌,Google,Chrome,检查工具栏常用功能介绍
  12. appcan注册功能php,appcan是什么
  13. [ZT]毁人不倦的应试教育(3)
  14. Debian设置合上笔记本盖子不休眠
  15. SVG格式图片的放大
  16. 初中数学题目(勾股定理) - 第一小题解答
  17. 学术期刊的 LaTeX整理合集(持续更新中)
  18. 解决Word2010中插入图片时变成空白框问题
  19. 魔兽会封python_Python爬取大量数据时,如何防止IP被封?
  20. 树莓派搭建nextcloud

热门文章

  1. java过滤器配置白名单,万字解析!
  2. 服务端为什么需要心跳(保活)机制
  3. 软件测试基础知识整理(详细版)收藏这篇足矣
  4. 沉香到底有什么用处呢?
  5. [软件评测第六期]搜狗浏览器
  6. huffman树的带权路径长度
  7. drf 安装_接口以及drf安装
  8. c语言实现哈夫曼树构造
  9. 4核处理器_4核处理器就吃不了鸡?600元AMD锐龙3100华硕套装900元B350崩盘
  10. JAVA-DAY21(数据库中的索引)