Ventuz中的shader 学习笔记(一)
Ventuz目前主要用于一些大型展会,三维实时交互,工业流程以及数据的可视化展示。
Shader在Ventuz中的使用可以使得效果变得更加炫酷。
1.搬运shadertoy中的效果
首先按照网上已有的词语替换规则修改代码
替换规则很容易查到
第二步 将渲染的效果固定到rect上
直接搬运的效果的uv坐标是通过:vec2 uv = fragCoord.xy / iResolution.xy;计算而来的(iResolution.xy/res.xy是固定值,按照工程的实际分辨率设定)
这个计算式是将rect中的每一点的uv值放入全屏幕空间,判断了该点在全屏幕空间的相对位置,这使得渲染的图案并不会跟从rect移动,形成一种shader在全屏渲染但是只能看到rect存在的部分的图案的错觉。
解决方法,更改与uv相关的计算公式,全部使用Input.uv进行计算
三、一个从shadertoy上面扒下来的火焰效果小例子
uniform float time;
#define MAX_ITER 22
float2 res;
float velocity=1.5 ;
#define detail_steps_ 26
#define mod3_ float3(.1031, .11369, .13787)
float offScale=0.5;float3 hash3_3(float3 p3);
float perlin_noise3(float3 p);
float noise_sum_abs3(float3 p);
float2 domain(float2 uv, float s);float4 Color
<string SasUiControl = "ColorPicker"; string SasUiLabel = "Color";
> = { 1.0f, 1.0f, 1.0f, 1.0f };float4x4 WorldViewProjection : WORLDVIEWPROJECTION;struct VS_INPUT
{float4 Position : POSITION;float2 uv : TEXCOORD0;
};
//飘动的参数
float _Magnitude;
float _Frequency;
float _InvWaveLength;
float _Speed;
//火焰参数
float2 moveUV(float2 vertUV)
{ float textureNum = 12.0; float timePerFrame = 100; float index = frac(time%(textureNum * timePerFrame)); float2 uvScale = float2(1 / textureNum*10, 1); if(index <= uvScale.x) return vertUV * uvScale; else if(index <= 2 * uvScale.x) return vertUV * uvScale + float2(uvScale.x, 0.0); else if(index <= 3 * uvScale.x) return vertUV * uvScale + float2(2 * uvScale.x, 0.0); else if(index <= 4 * uvScale.x) return vertUV * uvScale + float2(3 * uvScale.x, 0.0); else if(index <= 5 * uvScale.x) return vertUV * uvScale + float2(4 * uvScale.x, 0.0); else if(index <= 6 * uvScale.x) return vertUV * uvScale + float2(5 * uvScale.x, 0.0); else if(index <= 7 * uvScale.x) return vertUV * uvScale + float2(6 * uvScale.x, 0.0); else if(index <= 8 * uvScale.x) return vertUV * uvScale + float2(7 * uvScale.x, 0.0); else if(index <= 9 * uvScale.x) return vertUV * uvScale + float2(8 * uvScale.x, 0.0); else if(index <= 10 * uvScale.x) return vertUV * uvScale + float2(9 * uvScale.x, 0.0); else if(index <= 11 * uvScale.x) return vertUV * uvScale + float2(10 * uvScale.x, 0.0); else return vertUV * uvScale + float2(11 * uvScale.x, 0.0);
} struct VS_OUTPUT
{float4 Position : POSITION;float2 uv : TEXCOORD0;
};VS_OUTPUT VS( VS_INPUT Input )
{VS_OUTPUT Output;float4 offset=float4(0,0,0,0);Output.Position = mul(Input.Position, WorldViewProjection);offset.x = sin(3.1416 * time *40* clamp(-Input.uv.y+1, 0, 1)) * offScale;//摆动Output.Position.x+=offset.x;Output.uv=Input.uv;
// Output.uv=moveUV(Input.uv);return Output;
}float noise(float3 p) //Thx to Las^Mercury
{float3 i = floor(p);float4 a = dot(i, float3(1., 57., 21.)) + float4(0., 57., 21., 78.);float3 f = cos((p-i)*acos(-1.))*(-.5)+.5;a = lerp(sin(cos(a)*a),sin(cos(1.+a)*(1.+a)), f.x);a.xy = lerp(a.xz, a.yw, f.y);return lerp(a.x, a.y, f.z);
}float sphere(float3 p, float4 spr)
{return length(spr.xyz-p) - spr.w;
}float flame(float3 p)
{float d = sphere(p*float3(1.,.5,1.), float4(.0,-1.,.0,1.));return d + (noise(p+float3(.0,time*200.,.0)) + noise(p*3.)*.5)*.25*(p.y) ;
}float scene(float3 p)
{return min(100.-length(p) , abs(flame(p)) );
}float4 raymarch(float3 org, float3 dir)
{float d = 0.0, glow = 0.0, eps = 0.02;float3 p = org;bool glowed = false;for(int i=0; i<64; i++){d = scene(p) + eps;p += d * dir;if( d>eps ){if(flame(p) < .0)glowed=true;if(glowed)glow = float(i)/64.0;}}return float4(p,glow);
}float4 PS(VS_OUTPUT i ) : COLOR
{float2 v = 1.0 - 2.0 *i.uv;v=v*2;v.y+=1;float3 org = float3(0.0, -2.0, 4.0);float3 dir = normalize(float3(v.x*1.6, -v.y, -1.5));float4 p = raymarch(org, dir);float glow = p.w;float4 col = lerp(float4(1.0,0.5,0.1,1.0), float4(0.1,0.5,1.0,1.0), p.y*0.02+.4);float4 screenSpace = lerp(float4(0.0,0.0,0.0,0), col, pow(glow*2.0,4.0));
// screenSpace.a=0.8;return screenSpace;
}technique Tech1
{pass pass0{vertexshader = compile vs_3_0 VS();pixelshader = compile ps_3_0 PS();}
}
Ventuz中的shader 学习笔记(一)相关推荐
- Unity Shader 学习笔记(3)URP渲染管线带阴影PBR-Shader模板(ASE优化版本)
此 Shader 已经不是最新版本,最新版本见本专栏的第四篇文章: Unity Shader 学习笔记(4) 材质面板截图: 功能实现(URP渲染管线下): PBR材质.投射和接收阴影. 代码展示: ...
- Unity Shader 学习笔记(27)渲染轮廓线(描边)方法、卡通风格渲染、素描风格渲染
Unity Shader 学习笔记(27)渲染轮廓线(描边)方法.卡通风格渲染.素描风格渲染 参考书籍:<Unity Shader 入门精要> 渲染轮廓线(描边) 五种方法: 基于观察角度 ...
- Python中索引的学习笔记
1 前言 今天在学习FaceBoxes- 看到一个比较奇怪的代码,"order = scores.argsort()[::-1][:args.top_k]",不太懂这个" ...
- Unity Shader 学习笔记(33) 全局光照(GI)、反射探针、线性空间和伽马空间、高动态范围(HDR)
Unity Shader 学习笔记(33) 全局光照(GI).反射探针.线性空间和伽马空间.高动态范围(HDR) 参考书籍:<Unity Shader 入门精要> [<Real-Ti ...
- 机器人学中的状态估计——学习笔记
机器人学中的状态估计--学习笔记 离散时间的批量估计问题 1.最大后验概率法(Maximum A Posteriori, MAP) 2.贝叶斯推断(Bayesian inference) 离散时间的迭 ...
- 机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计
机器人学中的状态估计学习笔记(二)第三章线性高斯系统的状态估计 3.1 离散时间的批量估计问题 3.1.1 问题定义 3.1.2 最大后验估计 3.1.3 贝叶斯推断 3.1.4 存在性.唯一性与能观 ...
- Shader学习笔记(三)学习Shader所需的数学基础
感受高数 一.笛卡尔坐标系 1.二维笛卡尔坐标系 2.三维笛卡尔坐标系 二.点和矢量 1.矢量和标量的乘法/除法 2.矢量的加法和减法 3.矢量的模 4.单位矢量 5.矢量的点积 6.矢量的叉积(cr ...
- 【Unity】Unity Shader学习笔记(二)渲染管线
文章目录 渲染管线(Randering Pipeline) 渲染流程 可编程渲染管线 应用阶段 把数据加载到显存中 设置渲染状态 调用DrawCall 几何阶段.光栅化阶段 渲染管线(Randerin ...
- Java中expecial,RxJava 学习笔记 (一)
作者: 一字马胡 转载标志 [2017-12-13] 更新日志 日期 更新内容 备注 2017-12-13 RxJava学习笔记系列 系列笔记 (一) 2017-12-15 增加系列笔记(二) 201 ...
最新文章
- php取url后的文件名
- 0/0型极限等于多少_求极限时是否可以进行代入?
- Emgucv粗略抠取车牌
- .NET项目迁移到.NET Core操作指南
- Atitit.判断元素是否显示隐藏在父元素 overflow
- 【CCCC】L3-019 代码排版 (30分),大模拟
- C语言:要求输入一个字符,如果这个字符是小写字母,将这个字母转换成大写字母,否则保持不变
- ListView若干点
- Linux下安装jdk报Permission denied以及chmod详解
- contentprovider java_访问不了自己创建的Contentprovider,报错:java.lang.SecurityException: Permission Denial...
- 物联网控制的智能LED灯带(1):WS2812灯带控制(WS2812/2811,ESP32,NODE-RED)
- Removing a detached instance--删除失败
- 矩阵分析与应用-1.7-逆矩阵
- 快速开放,推荐一个视频通话sdk agora
- 基于springboot+vue+Java线上教学平台( 源码+文档)
- WLAN基本知识之无线基本概念
- SpO2、SaO2、PaO2、低氧血症概念及标准的总结
- 车站计算机系统具有自诊断功能,第五节自动检售票系统.ppt
- 使用IDEA远程debug调试(一篇懂所有)
- oauth2.0源码分析之oauth/token申请令牌