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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Docker(三) 通过gitlab部署CICD「建议收藏」

    Docker(三) 通过gitlab部署CICD「建议收藏」文章目录Docker(三)docker通过gitlab部署CICD一、部署gitlab1.1拉取gitlab镜像1.2运行gitlab镜像1.3配置1.4若发生502报错二、CI2.1Runner搭建2.2注册Runner2.3样例测试2.3.1新建maven-tomcat项目2.3.2创建.gitlab-ci.yml2.3.3编写Dockerfile文件2.3.4编写docker-compose.yml文件三、CD3.1安装Jenkins3.2配置目标服务器及Gitla

    2022年5月2日
    129
  • Javascript document.all用法「建议收藏」

    Javascript document.all用法「建议收藏」代码2:    但是常常name可以相同(如:用checkbox取用户的多项爱好的情况)              alert(document.all.aaa(0).value)  //显示a1    alert(document.all.aaa(1).value)  //显示a2    alert(document.all.bbb(0

    2022年7月15日
    21
  • 最好用的免费音乐播放器_最好用的免费音乐播放器

    最好用的免费音乐播放器_最好用的免费音乐播放器不知道大家在工作的时候,是不是跟我一样,喜欢听着自己熟悉的旋律,心情也会很好。但是,原来的很多经典歌曲,要么改收费一首歌几块钱、要么是翻唱的,听起来也没有原版好,对于我们这些只是偶尔听听歌的、写写东西的人来说,的确有点不方便。今天,小莫为大家挑选了四个,截止到目前还能正常使用,并且功能十分强大的音乐播放器,歌曲都是免费的,建议低调收藏。1、音乐社一款很简洁的音乐播放器,涵盖了主流播…

    2022年4月19日
    44
  • 基于Ubuntu20.04 Linux系统安装 Microsoft Edge浏览器 详细步骤

    基于Ubuntu20.04 Linux系统安装 Microsoft Edge浏览器 详细步骤目录1.MicrosoftEdge注意:最近在学习强度学习,作为刚起步的小白啥也不懂就先安装了最新的Ubuntu20.04,听很多人说这个版本相对之前的版本可以很方便的链接网络,个人感觉还不错。  个人之前一直使用Windows系统,初次接触Linux有不足之处请读者多多包含。在Windows系统的时候使用的浏览器,我还是比较喜欢使用MicrosoftEdge,之前用过一段时间的Chrome的参考资料:基于Linux的MicrosoftEdge浏览器1.Microsoft

    2022年7月21日
    20
  • 在线平面图设计教程[通俗易懂]

    在线平面图设计教程[通俗易懂]在介绍平面图之前先简单了解一下平面图的概念什么是平面图平面图,又称图则,是建筑物工程图的组成部分。当测区面积不大,半径小于10公里(甚至25公里)时,可以用水平面代替水准面。在这个前提下,可以把测区内的地面景物沿铅垂线方向投影到平面上,按规定的符号和比例缩小而构成相似图形,即为平面图。平面图以比例图绘制,表现该建筑物内的客厅、房间、空间及其它硬件的分布,其中包括主力墙、出入口、窗的位置图。平…

    2022年5月26日
    51
  • currentstyle 织梦_织梦arclist标签支持高亮currentstyle属性方法

    currentstyle 织梦_织梦arclist标签支持高亮currentstyle属性方法找到include/taglib/arclist.lib.php第一步:查找:$channelid=$ctag->GetAtt(‘channelid’);替换:$channelid=$ctag->GetAtt(‘channelid’);$currentstyle=$ctag->GetAtt(‘currentstyle’);第二步:查找:$ct…

    2022年7月14日
    15

发表回复

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

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