Open19

Shader毎日やるぞ

toutou nodetoutou node

2022/10/7~16

セラーノイズのボロノイ分割について

ボロノイについて

レイマーチングについて

ボロノイの母点と格子をレイマーチングした

3Dボロノイレイマーチング

アルゴリズム

  • 2Dの場合で、任意の点から最短のボロノイ頂点をもとめるアルゴリズムを考える
  • 3d voronoi diagramで検索すると論文とかがでてくる
  • 上を3Dに適応する
  • ドロネー分割で上手くいくか?

色付け

  • distance fog

格子

 // 繰り返し、rは繰り返しの間隔
			float3 trans(float3 p,float r)
			{
				return fmod(p,r)-r/2.0;
			}

			float cubesSDF(float3 p, float3 size)
			{
				p = abs(p);
				float3 e = trans(p,1) ;
				return length(max(abs(e) - size, 0.0)) ;
			}

			float grid2(float3 p )
			{
				float r = 0.01;
				// 四角柱を各方向に繰り返し描画
				float mx = cubesSDF(p,float3(1,r,r));
				float my = cubesSDF(p,float3(r,1,r));
				float mz = cubesSDF(p,float3(r,r,1));
				return min(min(mx,my),mz);
			}
toutou nodetoutou node

2022/10/17

3Dボロノイアルゴリズム調査

ボロノイ境界

実装方針

1

任意の点Pと最も近いボロノイ頂点を含む面に垂直な直線との距離を返す距離関数を実装

2

任意の点Pとボロノイ平面との距離を返す関数から、垂直二等分点を中心とした適当な半径の球の外にある場合のみ距離を返す、含まれている場合は0.01とかを返す。

toutou nodetoutou node

2023/06/25 初GLSL

https://twigl.app?ol=true&ss=-NYiiCxnTqx2khutYb-b
短縮前

#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2 resolution;

vec3 lightDir = normalize(vec3(1.0, 1.0, 1.0));


float sphereSDF(vec3 pos, float size){
	return length(pos) - size;
}

float planeSDF(vec3 p, vec3 n, float s) {
    return dot(normalize(n),p)-s;
}

float octaSDF(vec3 p, float s) {
    return planeSDF(abs(p), vec3(1.0, 1.0, 1.0), s);
}

float SDF(vec3 pos, float size)
{
    float sphere = sphereSDF(mod(pos,2.0)-1.0,size*(1.0+sin(time*2.0)*0.5));
    float octa = octaSDF(mod(pos,2.0)-1.0,size*0.9);
    return max(-sphere,octa);
}

vec3 getNormal(vec3 pos, float size)
{
    float ep = 0.0001;
    return normalize(vec3(
            SDF(pos, size) - SDF(vec3(pos.x - ep, pos.y, pos.z), size),
            SDF(pos, size) - SDF(vec3(pos.x, pos.y - ep, pos.z), size),
            SDF(pos, size) - SDF(vec3(pos.x, pos.y, pos.z - ep), size)
        ));
}

void main( void )
{   
    vec2 pos = (gl_FragCoord.xy * 2.0 - resolution.xy) / min(resolution.x, resolution.y);

    vec3 col = vec3(0.0);

    vec3 rayOrigin = vec3(0.0, 0.0, -time);
    float rayLength = 0.0;
    float currentDistance = 1.0;
    float epsilon = 0.01;

    vec3 rayDir = normalize(vec3((gl_FragCoord.xy - resolution * 0.5) / resolution.y, 0.5));
    vec3 P;
    float size = 0.5;
    for (int i = 0; i < 32; i++)
    {
	P = rayDir * rayLength + rayOrigin; 
        currentDistance = SDF(P, size);
        if (currentDistance < 0.0001)
        {
            vec3 normal = getNormal(P, size);
            float diff = dot(normal, lightDir);
            col = vec3(0.1,0.1,1)+vec3(diff) + vec3(0.1);
            break;
        }
        rayLength += currentDistance;
    }

    gl_FragColor = vec4(col, 1.0);
}