前言

上篇文章初学集合着色器实现了草地效果,这篇再次使用GS实现一个“爆炸效果”。为什么要加上引号呢,因为实现的其实不是一个传统的爆炸效果,更类似于面片向外扩散消失的一种科幻效果,其实通过修改面片大小,颜色和扩散方向,还可以模拟复仇者联盟三最后人化为灰烬的效果。
为什么要实现这个效果呢,实际上我最早知道几何着色器是下载了一个K神实现的开源demo,然后看到了一个非常酷炫的传送特效。

当时我第一感受就是“这尼玛也太太太太帅了吧!!!我什么时候也可以写出这种特效??!!”
感谢这是个开源Demo我可以看到其中的源码,我把下载地址提供给大家点我点我。这个网站还有很多同样酷炫的demo可供学习。这个特效其实使用的就是GS,然后通过调整面片的大小方向等来将物体“打碎”成粒子,再将粒子“重组”成物体。其实仔细观察“打碎”这个过程,有一部分图元用来表现传送了,还有一些细小的图元好像是粉末一样向外挥发掉了,我这次实现的就是后者这个效果,传送效果我以后会补上的。

实现

我其实参考大佬代码实现的Demo不是很复杂,直接放上代码吧。

Shader "MyShader/Explosion"
{Properties{_Color("Color Tint", Color) = (1,1,1,1)_Emission1("Emission1", Color) = (1,1,1,1)_Emission2("Emission2", Color) = (1,1,1,1)_Height("Height", Range(-1.5, 0.5)) = 0_TotalHeight("Total Height", Float) = 1_Strength("Explosion Strenth", Range(0, 10)) = 2_Scale("Scale", Range(0, 5)) = 1}SubShader{Tags { "RenderType"="Opaque"}Pass{Tags{"LightMode" = "ForwardBase"}Cull OffCGPROGRAM#pragma vertex vert#pragma geometry geom#pragma fragment frag#include "UnityCG.cginc" struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2g{float4 vertex : POSITION;float3 normal : NORMAL;};struct g2f{float4 pos : SV_POSITION;float3 normal : TEXCOORD0;float EmissionParam : TEXCOORD1;};fixed4 _Color;fixed4 _Emission1;fixed4 _Emission2;float _Height;float _TotalHeight;float _Strength;float _Scale;float3 randto3D(float3 seed){float3 f = sin(float3(dot(seed, float3(127.1, 337.1, 256.2)), dot(seed, float3(129.8, 782.3, 535.3)), dot(seed, float3(269.5, 183.3, 337.1))));f = -1 + 2 * frac(f * 43785.5453123);return f;}float rand(float3 seed){float f = sin(dot(seed, float3(127.1, 337.1, 256.2)));f = -1 + 2 * frac(f * 43785.5453123);return f;}float3x3 AngleAxis3x3(float angle, float3 axis){float s, c;sincos(angle, s, c);float x = axis.x;float y = axis.y;float z = axis.z;return float3x3(x * x + (y * y + z * z) * c, x * y * (1 - c) - z * s, x * z * (1 - c) - y * s,x * y * (1 - c) + z * s, y * y + (x * x + z * z) * c, y * z * (1 - c) - x * s,x * z * (1 - c) - y * s, y * z * (1 - c) + x * s, z * z + (x * x + y * y) * c);}float3x3 rotation3x3(float3 angle){return mul(AngleAxis3x3(angle.x, float3(0, 0, 1)), mul(AngleAxis3x3(angle.y, float3(1, 0, 0)), AngleAxis3x3(angle.z, float3(0, 1, 0))));}v2g vert(a2v v){v2g o;o.vertex = v.vertex;o.normal = v.normal;return o;}g2f VertexOutput(float3 pos, float3 normal, float param){g2f o;o.pos = UnityObjectToClipPos(float4(pos, 1));o.normal = UnityObjectToWorldNormal(normal);o.EmissionParam = param;return o;}[maxvertexcount(3)]void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream){float3 p0 = IN[0].vertex.xyz;float3 p1 = IN[1].vertex.xyz;float3 p2 = IN[2].vertex.xyz;float3 n0 = IN[0].normal;float3 n1 = IN[1].normal;float3 n2 = IN[2].normal;float3 center = (p0 + p1 + p2) / 3;float offset = (center.y - _Height) * _TotalHeight;if (offset < 0){triStream.Append(VertexOutput(p0, n0, -1));triStream.Append(VertexOutput(p1, n1, -1));triStream.Append(VertexOutput(p2, n2, -1));triStream.RestartStrip();return;}else if (offset > 1)return;float ss_offset = smoothstep(0, 1, offset);float3 translation = (n0 + n1 + n2) / 3 * ss_offset * _Strength;float3x3 rotationMatrix = rotation3x3(rand(center.zyx));float scale = _Scale - ss_offset;float3 t_p0 = mul(rotationMatrix, p0 - center) * scale + center + translation;float3 t_p1 = mul(rotationMatrix, p1 - center) * scale + center + translation;float3 t_p2 = mul(rotationMatrix, p2 - center) * scale + center + translation;float3 normal = normalize(cross(t_p1 - t_p0, t_p2 - t_p0));triStream.Append(VertexOutput(t_p0, normal, ss_offset));triStream.Append(VertexOutput(t_p1, normal, ss_offset));triStream.Append(VertexOutput(t_p2, normal, ss_offset));triStream.RestartStrip();}fixed4 frag(g2f i) : SV_Target{fixed4 color = step(0, i.EmissionParam) * _Emission1 + step(i.EmissionParam, 0) * _Color;if(i.EmissionParam > 0)color = lerp(color, _Emission2, i.EmissionParam);return color;}ENDCG}      }FallBack "Diffuse"
}

其实原理就是根据高度决定保留哪些三角面片原有的形态,再把剩余的三角面片根据中心点的位置,加上位移,旋转,缩放组成新的面片。
最终效果如下。

Unity Shader之几何着色器(Geometry Shader)实现面片飞散的爆炸效果相关推荐

  1. OpenGL 几何着色器Geometry Shader

    OpenGL几何着色器Geometry Shader 几何着色器Geometry Shader简介 使用几何着色器 造几个房子 爆破物体 法向量可视化 几何着色器Geometry Shader简介 在 ...

  2. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  3. Unity Shader:用几何着色器实现复联3灭霸的终极大招灰飞烟灭

    (图1:正常渲染) (图2:几何着色器粒子化特效进行中) (图3:几何着色器粒子化特效进行中) 1,用几何着色器进行图元转换 在OpenGL渲染管线中,几何着色器Geometry Shader有一个独 ...

  4. OpenGL基础41:几何着色器

    在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在<OpenGL基础3:渲染管线>这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果 一.最简单 ...

  5. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  6. 【OpenGL】笔记二十七、几何着色器

    1. 流程 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点.几何着色器可以在顶点发送到下一着色器阶段之前对它们随意 ...

  7. dx12 龙书第十二章学习笔记 -- 几何着色器

    如果不启用曲面细分(tessellation)这一环节,那么几何着色器(geometry shader)这个可选阶段便会位于顶点着色器与像素着色器之间.顶点着色器以顶点作为输入数据,而几何着色器的输入 ...

  8. LearnOpenGL学习笔记——几何着色器

    几何着色器 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点.几何着色器可以在顶点发送到下一着色器阶段之前对它们随意 ...

  9. 为新手准备的 Codea 着色器(Shader)教程

    为新手准备的 Codea 着色器(Shader) 教程 原文标题:<Shaders for dummies>  作者:Ignatz  译者:FreeBlues  译文链接:http://m ...

最新文章

  1. NeHe教程Qt实现——lesson02
  2. iptables规则备份恢复,firewalld的9个zone
  3. linux系统管理Linux系统实验,实验4-Linux系统管理实验.pdf
  4. 弹出层之1:JQuery.Boxy (二)
  5. 使用java理解程序逻辑(16)
  6. maven jsp报错javax.servlet.http.HttpServlet“ was not found on the Java Build Path
  7. hdu1312---------------DFS模板(调用STL)
  8. 从“果链”到新能源,立讯精密的B端生意成色几何?
  9. 给第一次参加数学建模竞赛的小白的建议
  10. 1 三角函数的正交性
  11. 计算机键盘上fn键,笔记本电脑键盘上Fn键的详细介绍
  12. [phyton]文件的简单读写练习
  13. 12306脱库疑云:410万用户数据仅售20美元!
  14. Hoofball(B题)
  15. java操控手机刷锦鲤看看(一个类似头条的赚钱app)
  16. mp4 转 mp3 命令行工具(超快)
  17. 推荐一款手机、电脑必备的效率工具,功能强大,支持所有平台
  18. python抽奖游戏大全_python实现转盘效果 python实现轮盘抽奖游戏
  19. 一张图看清国内程序员的分布数量
  20. ZigBee室内定位设备的天线与射频接口电路设计

热门文章

  1. 教育机构最需要的教育直播系统
  2. Element Upload 上传图片
  3. PATA 7-201 输出前n个英文大写字母
  4. tcl计算机语言,TCL语言
  5. 正面刚甲骨文?那不是华为GaussDB的格局
  6. multiset用法总结
  7. mybatis-plus查询sql条件拼接deleted = 0
  8. 多米尼加共和国商标注册概要和审查
  9. 用java定义姓名年龄_编写Java程序,用于显示学生的姓名和年龄、专业。
  10. 两年前端蚂蚁字节滴滴面试经历总结