利用shader生成随机数

本片文章主要讲述如何利用shader生成随机数。

一维随机

在这里插入图片描述
y = fract(sin(x)*1.0);
上面的例子中,我们提取了sin函数其波形的分数部分.我们可以用这种效果通过把正弦函数打散成小片段来得到一些伪随机数如何实现呢?通过在sin(x)的值上乘以大些的数。
在这里插入图片描述
y = fract(sin(x)*10.240);

在这里插入图片描述
y = fract(sin(x)*100.0);

在这里插入图片描述
y = fract(sin(x)*1000.0);

在这里插入图片描述
y = fract(sin(x)*10000.0);

当我们不断的进行增大时,其实我们增大的是sin函数的幅度,但是由于fract的限制,这其实是增加fract的定义域,它会形成-1——1之间的更加密集的点。
细看,你可以看到 sin() 在 -1.5707 和 1.5707 上有较大波动——那就是sin取得最大值和最小值的地方。并且我们的中部更加的集中。

我们当然可以使用一些其他的变化

y = rand(x);
y = rand(x)*rand(x);
y = sqrt(rand(x));
y = pow(rand(x),5.);

这些都是伪随机,也就是说给定特定的数,生成的是特定的随机。

二维随机

我们要进行二维随机,其实就是能够把两个轴分开来看待。
在这里插入图片描述

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

float random (vec2 st) {
    return fract(sin(dot(st.xy,
                         vec2(12.9898,78.233)))*
        43758.5453123);
}

void main() {
    vec2 st = gl_FragCoord.xy/u_resolution.xy;

    float rnd = random( st );

    gl_FragColor = vec4(vec3(rnd),1.0);
}

这里的dot可以根据不同的值位置,返回一个 0.0 到 1.0 之间的值。非常有用。
值得深思的问题是dot的值应该怎么取。首先必须要够大,很小的化,会拉低fract定义域。

我们根据得到坐标的整数部分作为一个通用值来隔离一个区域的像素,让它看起来像个单独的单元。然后我们可以用这个通用值来为这个区域得到一个随机值。因为我们的随机函数是伪随机,在那个单元内的所有像素返回的随机值都是一个常量。
在这里插入图片描述

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

float random (vec2 st) {
    return fract(sin(dot(st.xy,
                         vec2(12.9898,78.233)))*
        43758.5453123);
}

void main() {
    vec2 st = gl_FragCoord.xy/u_resolution.xy;

    st *= 10.0; // Scale the coordinate system by 10
    vec2 ipos = floor(st);  // get the integer coords
    vec2 fpos = fract(st);  // get the fractional coords

    // Assign a random value based on the integer coord
    vec3 color = vec3(random( ipos ));

    // Uncomment to see the subdivided grid
    // color = vec3(fpos,0.0);

    gl_FragColor = vec4(color,1.0);
}

结合这两个量 — 坐标的整数部分和小数部分 — 将使你可以结合变化和秩序。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
利用Shader实现边框效果的方法如下: 1. 创建一个新的Shader 在Unity中,可以通过在Project面板中右键点击创建一个新的Shader来创建一个新的Shader文件。 2. 编写Shader代码 在创建好的Shader文件中,可以使用Shader语言编写代码来实现边框效果。以下是一个简单的示例代码: ``` Shader "Custom/TextOutline" { Properties { _MainTex ("Texture", 2D) = "white" {} _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline Width", Range(0, 0.1)) = 0.005 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _OutlineColor; float _OutlineWidth; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { float4 col = tex2D(_MainTex, i.uv); float4 outline = tex2D(_MainTex, i.uv + float2(-_OutlineWidth, 0)) + tex2D(_MainTex, i.uv + float2(_OutlineWidth, 0)) + tex2D(_MainTex, i.uv + float2(0, -_OutlineWidth)) + tex2D(_MainTex, i.uv + float2(0, _OutlineWidth)); outline.a = 1.0; return lerp(outline, col, col.a); } ENDCG } } FallBack "Diffuse" } ``` 3. 将Shader应用到Text组件上 在创建好的Shader文件中,可以通过将Shader应用到Text组件的Material上来实现边框效果。具体的方法是在Project面板中选择Text组件的Material,然后将Shader设置为刚刚创建的Shader即可。 需要注意的是,以上示例代码实现的边框效果比较简单,可以根据实际需求来调整代码中的参数和算法。同时,Shader的编写也需要一定的基础知识和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Papals

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值