这几天在写shader的时候,发现sublime对shader的支持特别好用

Install Packages:

Unity Shader

GL Shader Validator

OpenGL Shading Language (GLSL)

ShaderLanguages

Shader Syntax (GLSL HLSL Cg)

装好这几个包后,shader会高亮和自动跳转

--------------------- 分割线 ----------------------------

题外话:

在看了SG原文博客后,我打算按照博客中列出的点去学习。博客地址

原文:

Flags and cloths in the wind (Shader Lightmap + Wind)

Information which vertices are fluttering in the wind and which are not is defined by the vertex colors alpha in 3d modeling program (white alpha moves, black alpha dont). In shader parameters, user must define the direction and speed of flutter only.

在风中的旗帜和布料

我们在顶点的颜色中,使用alpha通道来决定哪些顶点需要飘动哪些不需要(1alpha是需要移动的,0则不需要)。具体的飘动方向和速度需要在材质中确定。

把光照的所有去掉,只看移动顶点的部分。

效果:

原理:

按照波动的效果去修改面片的顶点位置

运行时实际的顶点位置偏移

源码:

Shader "CrazyShader/FlagWind"
{Properties{_MainTex ("Texture", 2D) = "white" {}// 风的方向//_Wind ("Wind Params", Vector) = (1, 1, 1, 1)// 原文中的fultter拼写错误 应为flutter 飘动// 边缘移动的距离 也就是移动幅度//_WindEdgeFlutter("Wind Edge flutter factor", float) = 0.5////_WindEdgeFlutterFreqScale("Wind edge flutter freq scale", float) = 0.5}SubShader{Tags { "Queue"="Transparent" "RenderType"="Transparent"}LOD 100Blend SrcAlpha OneMinusSrcAlphaCull Off ZWrite OffCGINCLUDE#include "UnityCG.cginc"#include "TerrainEngine.cginc"sampler2D _MainTex;float4 _MainTex_ST;float _WindEdgeFlutter;float _WindEdgeFlutterFreqScale;struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0; };// 修改顶点的函数//inline float4 AnimateVertex2(float4 pos, float3 normal, float4 animParams, float4 wind, float2 time){// animParams stored in color// animParams.x = branch phase// animParams.y = edge flutter factor// animParams.z = primary factor// animParams.w = secondary factorfloat fDetailAmp = 0.1f;float fBranchAmp = 0.3f;// Phases (object, vertex, branch)float fObjPhase = dot(unity_ObjectToWorld[3].xyz, 1);float fBranchPhase = fObjPhase + animParams.x;float fVtxPhase = dot(pos.xyz, animParams.y + fBranchPhase);// x is used for edges; y is used for branchesfloat2 vWavesIn = time  + float2(fVtxPhase, fBranchPhase );// 1.975, 0.793, 0.375, 0.193 are good frequenciesfloat4 vWaves = (frac( vWavesIn.xxyy * float4(1.975, 0.793, 0.375, 0.193) ) * 2.0 - 1.0);vWaves = SmoothTriangleWave( vWaves );float2 vWavesSum = vWaves.xz + vWaves.yw;// Edge (xz) and branch bending (y)float3 bend = animParams.y * fDetailAmp * normal.xyz;bend.y = animParams.w * fBranchAmp;pos.xyz += ((vWavesSum.xyx * bend) + (wind.xyz * vWavesSum.y * animParams.w)) * wind.w; // Primary bending// Displace positionpos.xyz += animParams.z * wind.xyz;return pos;}v2f vert(appdata_full v){v2f o;float4 tempWind;// 通过alpha通道判断顶点是否飘动//float blendingFact = v.color.a;// 风的方向//tempWind.xyz = mul((float3x3)unity_WorldToObject, _Wind.xyz);tempWind.w = _Wind.w * blendingFact;// 风的参数//float4 windParams = float4(0, _WindEdgeFlutter, blendingFact.xx);// 风移动 按照_WindEdgeFlutterFreqScale 放大缩小偏移//float windTime = _Time.y + float2(_WindEdgeFlutterFreqScale, 1);float4 mdlPos = AnimateVertex2(v.vertex, v.normal, windParams, tempWind, windTime);o.pos = UnityObjectToClipPos(mdlPos);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}ENDCGPass{CGPROGRAM#pragma debug#pragma vertex vert#pragma fragment fragfixed4 frag(v2f i) : COLOR{fixed4 c;fixed4 tex = tex2D(_MainTex, i.uv);c.rgb = tex.rgb;c.a = tex.a;return c;}ENDCG}}
}

说明:

1.旗帜的素材是四通道,其中用来决定是否顶点移动的alpha通道是这样的

只有不透明的地方才会显示和飘动

2.飘动的波动用shader内置的_Time来表示

_Time float4 t 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t*2, t*3)

这里的t是秒

3.核心程序在AnimateVertex2中,我发现是参照TerrainEngine.cginc中的AnimateVertex写的。

fVtxPhase表示旗帜编译移动的距离

fBranchPhase表示旗帜主干移动的距离

ShadowGun 飘动的旗帜相关推荐

  1. Android实现飘动的旗帜效果实例

    做一个飘动的旗帜效果,思路大概为:将旗形的波浪分割成很小的四边形,然后多少时间进行刷新,Z方向上运用sin函数改变,看起来有飘动的感觉 实例代码如下: 1.准备图片资源 : initBitmap类 i ...

  2. 虚幻引擎图文笔记:使用布料模拟(Cloth Simulation)系统制作一面可以随风飘动的旗帜(更新)

    本文使用引擎版本:UE4.26 UE4的布料系统真是强大,可以在游戏运行时实时解算布料出动画.本文以一面随风飘动的旗帜的制作为例,带大家了解一下UE4布料模拟(Cloth Simulation)系统的 ...

  3. OpenGL学习三十九:飘动的旗帜

    (此节内容对应NEHE教程第11课) 目前为止我们做的例子都是平面的,这个例子是带有波动效果的, 2维图形包括X,Y两个坐标系.因此看到的是平面的. 3维图形由X,Y,Z三个坐标系构成,当Z坐标不为0 ...

  4. 技术研究:Unity中Shader Graph之飘动的旗帜(一)

    公众号[知享奇] 发送"ShaderGraph00"获取本文章的shader. 目的 学习使用Shader Graph制作一个可以飘动的旗帜. 效果展现 制作准备 Unity版本 ...

  5. java飘动_OpenGL -- 飘动的旗帜 (java)

    原创内容,转载请注明EOE论坛.       声明:因为本人的学习都是居于杨丰盛老师的<Android应用开发揭秘>一书,因此,本内容教程代码和大部分的内容都来自公布在网络上的杨老师的代码 ...

  6. Nehe教程第11课飘动的旗帜

    点击打开链接 #include <windows.h> // Windows的头文件 #include <gl/glew.h> // 包含最新的gl.h,glu.h库 #inc ...

  7. 前端实现旗帜飘动效果系列 (Ⅰ):dom+css实现

    hello,民娜桑~~我又来开新坑了( ̄ε(# ̄)╰╮o( ̄皿 ̄///),这次尽量保证把这个坑填完~ 本系列我会分四篇来完成主题,分别是① DIV+CSS的实现,② canvas2D的简单实现,③ c ...

  8. Qt OpenGL 旗帜效果(飘动的纹理)

    这次教程中,我将教大家如何创建一个飘动的旗帜.我们所要创建的旗帜,说白了就是一个以正弦波方式运动的纹理映射图像.虽然不会很难,但效果确实很不错,希望大家能喜欢.当然这次教程是基于第06课的,希望大家确 ...

  9. Unity3D制作飘动旗帜代码

    我用max的布料加风力制作了飘动的旗帜,并且把动画转为了关键贞,可是fbx导入u3d后没有反应,请教大家u3d怎样模拟布料,它自带的布料不能像旗帜一样有固定范围; #pragma strict var ...

  10. WhyGL:一套学习OpenGL的框架,及翻写Nehe的OpenGL教程

    最近在重学OpenGL,之所以说重学是因为上次接触OpenGL还是在学校里,工作之后就一直在搞D3D,一转眼已经毕业6年了.OpenGL这门手艺早就完全荒废了,现在只能是重学.学习程序最有效的办法是动 ...

最新文章

  1. vim-go开发环境安装
  2. 如何禁用单个FegionClient的Hystrix的支持
  3. 大型数据库的设计原则与开发技巧
  4. 最大数max(x,y,z)(信息学奥赛一本通-T1152)
  5. 7070mt安装ubuntu dell_【手把手AI项目】一、安装win10+linux-Ubuntu16.04的双系统(超细致)...
  6. raster | R中的栅格操作符(上)[翻译]
  7. IntelliJ 一键添加双引号
  8. Windows 2008-TS测试-TS GateWay
  9. 十九、Oracle学习笔记:行变量
  10. 使用Flink实现索引数据到Elasticsearch
  11. restlet Framework2.2和2.3版本的对比
  12. keil 局部变量不能查看值,显示为not in scope
  13. 如何炸掉……呃,月球?
  14. 希尔伯特到解析信号,再到复包络
  15. vue项目添加百度统计
  16. android官网被封掉了,只好用这个网站进谷歌了!嘎嘎
  17. candidate key, primary key, superkey的区别
  18. 项目管理关键路径法解析
  19. 红米10x和荣耀x10哪个好
  20. ERP实施-生产模块-报废率测试及用途总结

热门文章

  1. 数据结构: 树形结构+思维导图
  2. PWM驱动sg90电机
  3. 2021中青杯数学建模A题
  4. 基于51单片机的声音分贝测量与显示仿真
  5. 【Ubuntu】成功在Ubuntu18.04安装搜狗拼音输入法(无中文乱码)
  6. 麦克风阵列入门(一)
  7. 在java中new一个对象的流程是怎样的
  8. SpringBoot使用Ehcache
  9. 构建自己的Aleax查询服务
  10. 在计算机中 ascii码是几位二进制编码,二进制ASCII码