欢迎光临散文网 会员登陆 & 注册

godot 随机地图4 生成voronoise的基点

2023-05-22 17:32 作者:damedown  | 我要投稿

在之前的测试代码中,我们使用的是uv到基点的距离来填色,越原理基点值越大,也就越白。简单的形容就是又大又白。

一、我们先随机生成色彩,当然还是用sincos取小数,这样随机有可靠。

    1、准备一个noise

    2、判断的时候不仅仅判断最小距离,还要判断最小uv,把uv 给换着花园给float noise 处理三次得到一个vec3,当做色彩。

这时候我们已经得到了很稳定的index产生的色彩,并且图形稳定。


二、传入稳定的index color,并且基础color和map相关。

    1、voronoise和随机地图的关系

    就像上图,是正方形的,但是我如果在voronoise的的index没有偏移的时候也是正方形的。如果我们的基础图形按照这个方式生成,也就没毛病了。如果在这个基础上去生成图形,这样地图的随机是建立在我们已有的地形规划之上。


    2.0 对于基础地图生成的需求大致分成两类

    我们为了生成基础点图,会用上地图分层

        这时候我们有两种方法

        第一种是使用一阶noise控制高度,然后多次生成,这样有一个好处就是可控性高,并且代码简单。

    大概就像这样子。

    第二种方法是使用marble texture noise

https://www.shadertoy.com/view/NtccWM

    实际上marble在只在noise texture的基础上改了一点点

    如果我们这时候把返回的color的v再改一下随着Y越大,颜色越深。

    但是我并不想。

    虽然这样很好的分层了,但是我需要的是像泰拉瑞亚那样的游戏地图,不然我也不会出godot的笔记,因为godot对2d支持太好了。但不能让我控制FBO,不过也没关系,我已经满足了。

    使用marble会很难控制我想生成的地图。不过marble的特性可以让我们对他多多调教。

    比如

    斜的

    竖的

    越往下越暗

去掉0.5,,fract(base_uv.y)/2.5

    

    2.1使用noise_1D创建

    有两种方案处理:

        第一种是创建一个512*1的image让shader去处理

        第二种是创建PackedFloatArray就在CPU上干了,处理512次,后面还可能更多,优化了少1/10秒,没必要。

    

    因为生成image在shader上面干,是必须要做的,这里就熟悉使用PackedFloat32Array。

    在源码中他们就是vector的套牌

        

然后就意识到,我还没分型呢。如果是1024次,还得分型5次。靠。我们跟着写一个生成texture的。


    2.2生成image 扔给shader并行处理

    因为godot不能直接调用fbo,虽然少了一点自由度,但是无伤大雅。

    但是随后发现godot的texture不能随便设置


    但是随后发现godot的shader不能随便给texture套用

    但是随后发现godot的sprite2D必须预先设置特效图热的大小

    但是随后发现godot的image的长宽是局部函数

    此时此刻,我心里面在奔腾

不过imagetexture继承了texture的特性,而且还有w和h

随后我发现可以create image

随后我又发现这是错的,image不能new后就不能在设置大小了,然而我必须使用

我尼玛,你可不可以保留这个new,你这个操作很反人类啊。

但是image是保存与内存上的东西,texture才能保存在显存上

这样操作屁反应也不会有,我的sprite2D并不能把它的texture进行处理。

我尼玛,那我就得把texture.set_data()

然并卵什么也没有

即便我await changed

 2.3 三个小时也没解决,我放弃了

    没法了,我只能使用杀器了:打开ps,创建一个512*1 png的图片扔进去,3分钟

   

我稍微有点点无语,好吧,如果我开发游戏引擎,也不会想到有人会这样操作。

voronoise的大小是125*125,用的godot头像

所以我大胆的猜测,godot的image并不是用来生成图片的,而是纯粹用来截图保存了。

那我赶快给他写一个shader,这里直接套用2Dnosie的shader,因为y为1,也没啥变化,那我的y就可以改为seed。

    我真是真的一个愣头青傻批。

    2.4优化noise2d

因为noise是分型多层叠加,fractal brownian motion的参数我也左右修改,如果看不习惯可以自己改回去,下面提供了原词。相对的国外作者,那全是缩写,刚学的时候全都不认识。

为了改为1D的noise,我把uv.y的数据抛弃,直接改为seed

抛弃

这样我就得到一个512*1的图片了。

fbo的特性就是穿入多大的texture,就创建多大的计算阵列,这里传入512*1,那就是512*1的并行度,不会多和少。如果sprite2d缩放后,只是换一种方式采样,fragment的处理的texture的数据不会变化。

缩放后的sprite2D改变你的fragmentshader 后面的testing blending(混色)过程。所以不用担心。

    2.5 我们把时间暂停,把texture的数据导出去

    操蛋的事情有发生了

他获得了我原始image的数据。我尼玛。

然后我使用godot的头来测试

他又对了,我再次尼玛。我真尼玛的,艹了,真的是有毒。

人的精力是有限的,但是别人的操蛋是无限的。

我就不信邪了,我扔一个512*10的进去试一试。

还是原始数据

我有传入一个512*10的svg进去,还是不行

我尼玛呵呵了。

没办法了,我只能直接用mesh了,用传统的opengl的方式,这下他跑不掉了吧。

godot 随机地图4 生成voronoise的基点的评论 (共 条)

分享到微博请遵守国家法律