Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」目的:我的2D游戏,需要一个有特定感觉的“漩涡shader”。上一节里,我简单实现了这个:但转动有些乏味,它的转动动作是类似这样的:(网图)接下来想让它动起来更加深邃,恐怖。本文先搞了2种效果:(图3,扩散瞳孔)(图4,深渊)抽象分析:前篇的Shader效果之所以看起来乏味,是因为在旋转的时候,像素点的极长(以方块中心为原点极坐标系)并没有改变,只是越接近中心,点的旋转量越小而已。(旋转前后点都在同心圆上)如果我想要深渊有“吃人”的感觉,那么内部的

大家好,又见面了,我是你们的朋友全栈君。

目的:

我的2D游戏,需要一个有特定感觉的“漩涡shader”。

上一节里,我简单实现了这个:

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

但转动有些乏味,它的转动动作是类似这样的:

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

(网图)

接下来想让它动起来更加深邃,恐怖。本文先搞了2种效果:

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

(图3,扩散瞳孔)(图4,深渊)

抽象分析:

前篇的Shader效果之所以看起来乏味,是因为在旋转的时候,像素点的极长(以方块中心为原点极坐标系)并没有改变,只是越接近中心,

点的旋转量越小而已。

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

(旋转前后点都在同心圆上)

如果我想要深渊有“吃人”的感觉,那么内部的点就要往外转,有种瞳孔扩大的感觉

Chango的数学Shader世界(二十三)漩涡Shader-复数分析(深渊)「建议收藏」

(图6,期望效果)

数学分析:

之前说过,涉及旋转,极坐标/复数往往比线代好,下面用复数推导。

设原先点在(u0,v0),复数为s_{0}e^{\theta _{0}},程序旋转缩放的变幻为s_{1}e^{-\theta _{1}}(顺时针转),当前点位置se^{\theta }

s_{0}e^{\theta _{0}} \cdot s_{1}e^{-\theta _{1}} = se^{\theta _}

可得:

s_{0} = \frac{s}{s1}=\frac{\sqrt{u^{2}+v^{2}}}{s1}

\theta _{0} = \theta +\theta _{1}

由于我们写到shader,输入是u,v,s1,theta1,输出是u0,v0。所以比较方便的是theta0就推导到这步,然后代入:

u_{0} =s_{0}\cdot cos(\theta_{0} )=s_{0}\cdot cos(\theta +\theta_{1} )=s_{0}\cdot (u/s\cdot cos(\theta _{1})-v/s\cdot sin(\theta _{1}))

v_{0} =s_{0}\cdot sin(\theta_{0} )=s_{0}\cdot sin(\theta +\theta_{1} )=s_{0}\cdot (v/s\cdot cos(\theta _{1})+u/s\cdot sin(\theta _{1}))

其中s = \sqrt{u^{2}+v^{2}}

Shader代码:

uniform sampler2D tex; 
uniform float maxScale;
varying vec2 texCoord2D;
void main() 
{ 
	float pi = 3.1415926f; 
	float u = texCoord2D.x-0.5f; 
	float v = texCoord2D.y-0.5f; 
	float s = sqrt(u*u+v*v);
	float scale = mix(1.0f,maxScale,s/0.707f);
	//float scale = mix(maxScale,1.0f,s/0.707f);
	float s0=s/scale;
	float a = pi;
	float u0 = s0*(u/s*cos(a)-v/s*sin(a));
	float v0 = s0*(v/s*cos(a)+u/s*sin(a));
	if(abs(u0)>0.5||abs(v0)>0.5)
	{
		discard;
	}
	vec2 uv0 = vec2(u0+0.5,v0+0.5); 
	gl_FragColor = texture(tex, uv0);
}

计算scale的时候,被注释的那行是图3,也就是上述“瞳孔方法”效果的算法,即越接近中心的点,越被发散到外面去。

我尝试互换了一下mix中的x,y值,让越远的点放得越大,出现了图4″深渊”的效果,可惜的是这种算法最后深渊底部总是会变黑,因为图片中心部分的像素有限。

 

结语

下次看看能否调整图片大小,或其他办法,让整个临场恐怖感加深。

使用复数在本篇里仅仅是符号简洁,易于推导,完全可以用极坐标。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151188.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月19日 下午11:36
下一篇 2022年6月19日 下午11:46


相关推荐

  • matlab 中产生高斯白噪声

    matlab 中产生高斯白噪声一 matlab 里和随机数有关的函数 1 rand 产生均值为 0 5 幅度在 0 1 之间的伪随机数 2 randn 产生均值为 0 方差为 1 的高斯白噪声 3 randperm n 产生 1 到 n 的均匀分布随机序列 4 normrnd a b c d 产生均值为 a 方差为 b 大小为 cXd 的随机矩阵 randrand n 生成 0 到 1 之间的 n 阶随机数方阵 rand m n

    2026年3月18日
    2
  • 如何制作rootfs_linux常用文件系统类型

    如何制作rootfs_linux常用文件系统类型rootfs文件系统制作笔记环境:XC2440linux2.32.2红帽5根文件系统有一系列的目录组成,其中包括应用程序、C库、及相关的配置文件。制作根文件系统的步骤如下,下面步骤均在虚拟机终端上操作。一、创建文件系统总目录rootfs【mkdirrootfs】二、创建文件系统目录【cdrootfs】进入rootfs目录,创建下面目录/bin–放置…

    2022年10月7日
    5
  • 渗透测试技术_Nessus工具(二) _漏洞扫描工具 Nessus的使用教程

    渗透测试技术_Nessus工具(二) _漏洞扫描工具 Nessus的使用教程漏洞扫描工具Nessus的使用教程1、Nessus使用教程1.1、Nessus登录在浏览器中访问:https://{服务器IP}:8834例如访问:https://10.1.1.191:8834/输入你注册的账号密码进行登录,例如:nessus_casb/liaxx,进入主页面。1.2、新建1个主机扫描1.2.1、点击右上角的”NewScan”新建一个扫描1.2.2、选择“BasicNetworkScan”,进行配置项目名称,对项目的描述,以及最重要的目标I.

    2022年10月18日
    5
  • 利用OutSystems创建你的第一个移动应用

    利用OutSystems创建你的第一个移动应用使用 OutSystems 开发移动应用程序非常简单 如果您有包含数据的 Excel 文件 则可以将其导入数据库并快速创建移动应用程序 然后随时查阅和管理数据

    2026年3月18日
    2
  • pycharm怎么设置中文版_如何把pycharm改成中文版

    pycharm怎么设置中文版_如何把pycharm改成中文版Pycharm设置中文版注意:1.只有最新版才支持。要2021.1月份后的Pytharm版本。2.要激活自己淘宝。步骤:1.打开pycharm。选择”文件-设置”.2.选择”插件“,搜索”chinese“,安装如图所示。3.安装安城后重启即可。…

    2022年8月26日
    12
  • Pycharm导入模块失败原因

    Pycharm导入模块失败原因最近我在学习 Python 函数过程中出现了导入文件失败的问题 困扰了我好几天 我 PC 端下载了两个版本的 python 环境 Python2 7 和 Python3 8 应该是我的 Python3 8 包有点问题 所以导入文件失败 我试着换成了 Python2 7 环境 这个问题就解决啦 为了解决这个问题 我也在网上查询了好多 在这里也跟大家分享一下哈 pycharm 中搜索包时都是从根目录查找 所以有时文件多了就会混乱 需要把当前文件夹指定为 sorce 目录即可 具体操作如下

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号