8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GPU で暖を取りたい人のための GLSLAdvent Calendar 2017

Day 15

2次元ディスタンスフィールド使い方

Last updated at Posted at 2018-01-09

はじめに

2次元ディスタンスフィールドまとめでは色々な距離関数(ディスタンスフィールド)について紹介しました。しかし、距離関数(ディスタンスフィールド)だけでは図形を描くことはできません。距離関数(ディスタンスフィールド)に距離を設定することではじめて図形を描くことができます。ここでは、距離関数(ディスタンスフィールド)に距離を設定して、塗り、線、グロウなど、様々な図形の描画方法を紹介します。

距離の設定と、線・塗り

距離を設定する(放射状グラデーション塗り)

まず、素のままの距離関数(ディスタンスフィールド)を可視化してみます。

rawdist.png

precision mediump float;
uniform vec2  m;       // mouse
uniform float t;       // time
uniform vec2  r;       // resolution
uniform sampler2D smp; // prev scene

void main(void){
	vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y);
	float distanceFunc;
	float bright;
	float radius=.5;
	distanceFunc = length(p);
	// direct output
	bright = distanceFunc;
	// gradation circle  
	//bright = radius - distanceFunc;
	// circle fill
	//bright = step(0.,radius - distanceFunc);
	// circle stroke
	//bright = 1.-step(.005,abs(radius - distanceFunc));
	// circle fill + glow
	//bright = radius / distanceFunc;
	gl_FragColor = vec4(vec3(bright), 1.0);
}

この時点ではまだ図形が確定していません。

これに距離.5を与えてあげると半径0.5のグラデーションの円が描けます。

gradcircle.png

bright = radius - distanceFunc;

べた塗り

グラデーションの塗りで0.以上を1.としてあげればベタ塗りが出来ます。

fillcircle.png

bright = step(0.,radius - distanceFunc);

linecircle.png

bright = step(abs(radius - distanceFunc),.005);

塗り+ glow

glowfill.png

bright = radius / distanceFunc;

glow

グロウ

glow.png

bright = 0.01 / abs(distanceFunc - radius);

グロウ(外側)

glowOuter.png

bright = 0.01 / (distanceFunc - radius);

グロウ(内側)

glowInner.png

bright = 0.01 / -(distanceFunc - radius);

アンチエイリアス

線や塗りで、stepのところをsmoothstepに変えて極小な範囲を設定するとアンチエイリアスを掛ける(ギザギザを無くす)ことができます。

antifill.png

bright = smoothstep(0.,.01,radius - distanceFunc);

antiline.png

	bright = 1.-smoothstep(.005,.015,abs(radius - distanceFunc));

グラデーション

smoothstepの範囲を大きくすると任意の長さのグラデーションとして利用できます。

gradfill.png

bright = smoothstep(0.,.5,radius - distanceFunc);

gradline.png

bright = 1.-smoothstep(.005,.5,abs(radius - distanceFunc));

参考

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?