前回の続き。DAZ3D studio の画像をアニメ塗りにする画像処理の試行です。
色々確かめながら良い方法を探っています。
前回の続き。DAZ3D studio の画像をアニメ塗りにする画像処理の試行です。
色々確かめながら良い方法を探っています。
DAZでレンダリングした画像を python でクラスタリングしたりレタッチしたりしてアニメ風の厚塗りにしてみたい。
HSV系に変換して明るさを離散的にして色々と編集する試行のメモです。
ちなみに python 初心者なんで検証はしてるけどコード自体は怪しいです。
Daz studio でアニメ絵っぽくレタッチできるかの覚書。
アニメ絵っぽくというのは「色がIrayレンダリングよりのっぺりしてて、輪郭線がある」という風に解釈します。
途中で前回の分離レンダリングを使います。
また、Dazメインの内容で画像編集のほうは詳しく触れません。
久々にGLSL触るのでこれまでと違う動きを試してみる。
以下の #つぶやきGLSL の作成ログでもあります( #20 )。
vec2 p=FC.xy/r;
float t=mod(t,10.),k=.1,y=mod(t*.2,k*2.),z=floor(t*.2/k/2.)*k;
float n=y<k?y:k,m=y<k?0.:y-k;
for(float i=-1.;i<=1.;i+=.2)
for(float j=-1.;j<=1.;j+=.2)
if(length(vec2(n+z,m+z)-(p-vec2(j,i)))<.05)
o=vec4(p.xy,i*j,1)+texture(b,p); pic.twitter.com/BrPDzXOGIF— Narumium (@Nr_Narumium) January 11, 2021
まずは点を階段状に動かしてみる。
十字パターンのときのようにstep関数を使ってもいいんですが、単純に移動時間の半分ずつを横移動・縦移動に割り当てます。
1 2 3 4 5 6 7 8 9 10 |
precision highp float; uniform vec2 resolution; uniform float time; void main(){ vec2 r=resolution,p=gl_FragCoord.xy/r.y; float y=mod(time,1.),z=floor(time/1.)*.5; float n=y<.5?y:.5, m=y<.5?0.:y-.5; if(length(vec2(n+z,m+z)-p)<.05) gl_FragColor=vec4(1); } |
動きの大きさ、点の大きさ、点の数を変えてみます。
1 2 3 4 5 6 7 8 9 10 |
precision highp float; uniform vec2 resolution; uniform float time; void main(){ vec2 r=resolution,p=gl_FragCoord.xy/r.y; float y=mod(time,1.),z=floor(time/1.)*.5; float n=y<.5?y:.5, m=y<.5?0.:y-.5; if(length(vec2(n+z,m+z)-p)<.05) gl_FragColor=vec4(1); } |
動きを遅くして、横方向にも敷き詰めます。
1 2 3 4 5 6 7 8 9 |
void main(){ vec2 r=resolution,p=gl_FragCoord.xy/r.y; float t=mod(time,10.),k=.1,y=mod(t*.2,k*2.),z=floor(t*.2/k/2.)*k; float n=y<k?y:k, m=y<k?0.:y-k; for(float i=-1.;i<1.;i+=.2) for(float j=-1.;j<1.;j+=.2) if(length(vec2(n+z,m+z)-(p-vec2(j,i)))<.01) gl_FragColor=vec4(1); } |
点の大きさを調整し、適当に色を付けます。
動いてる感を出すためにバックバッファを使ってみます。
1 2 3 4 5 6 7 8 9 10 |
uniform sampler2D bb; void main(){ vec2 r=resolution,p=gl_FragCoord.xy/r.y; float t=mod(time,10.),k=.1,y=mod(t*.2,k*2.),z=floor(t*.2/k/2.)*k; float n=y<k?y:k, m=y<k?0.:y-k; for(float i=-1.;i<=1.;i+=.2) for(float j=-1.;j<=1.;j+=.2) if(length(vec2(n+z,m+z)-(p-vec2(j,i)))<.05) gl_FragColor=vec4(p.xy,i*j,1)+texture2D(bb,p); } |
雑に文字数を減らすため、geekestに切り替えて作成完了。
texture2D がなくて texture にしないといけないところで少しハマった。
1 2 3 4 5 6 7 |
vec2 p=FC.xy/r; float t=mod(t,10.),k=.1,y=mod(t*.2,k*2.),z=floor(t*.2/k/2.)*k; float n=y<k?y:k,m=y<k?0.:y-k; for(float i=-1.;i<=1.;i+=.2) for(float j=-1.;j<=1.;j+=.2) if(length(vec2(n+z,m+z)-(p-vec2(j,i)))<.05) o=vec4(p.xy,i*j,1)+texture(b,p); |
久々だったので最初に戸惑いましたが書き始めたらのってきた。
記事が大分偏ってきてるし、つぶやきGLSL以外でもなんかしたいなぁ。
黄金螺旋のような渦で何か書きたい。
基本的な対数螺旋から確認していきます。
以下の #つぶやきGLSL の作成ログでもあります( #19 )。
#つぶやきGLSL#define C(a,b)if(length(s*vec2(a,b)-p)<s*.5)
mat3 m=mat3(1);vec3 u;vec2 p=(FC.xy*2.-r)/r;
for(float i=0.;i<20.;i++){float h=atan(p.x,p.y),TAU=2.*acos(-1.),y=mod(t+i,20.),j=mod(i,3.),a=sin(y),b=cos(y),s=.01*exp(.3*y);C(a,b)u+=m[int(j)];C(b,a)u+=m[2-int(j)];}
o.rgb=u; pic.twitter.com/Q4f38id9zO— Narumium (@Nr_Narumium) December 9, 2020
前回「【GLSL】十字パターンを考える」の続きです。
以下の #つぶやきGLSL の作成ログでもあります( #18 )。
#つぶやきGLSL #CROSS#define C(a) q.y a floor(q.x*5.)*.1
vec2 p=FC.xy/r;
float n=1./3.,s=abs(sin(t)),c=abs(cos(t));
for(float i=.0;i<1.8;i+=.3){
vec2 q=p-vec2(n*i,i-.1);
if(C(+)>.0)o.b+=.1*s;
if(C(+)<.0)o.r+=.1*c+.1; q=q.yx;
if(C(-)>.9)o.g+=.15*s;
if(C(-)<.9)o.b+=.15*c+.1;
} pic.twitter.com/35RkAZtUAV— Narumium (@Nr_Narumium) November 30, 2020
クロス♰を敷き詰める模様を書いてみます。
以下の #つぶやきGLSL の作成ログでもあります( #17 )。
#つぶやきGLSL#define C(c,k)q=abs((p-vec2(i,j)*.2-.1-a*k)*m);q=(q.y>q.x)?q.yx:q.xy;if(q.x<.06&&q.y<.02)o.c+=.8;
vec2 p=FC.xy/r,a=vec2(.08,.04),q;
mat2 m=mat2(cos(t),sin(t),-sin(t),cos(t));
for(float i=-2.;i<5.;i++)for(float j=-1.;j<5.;j++){
C(rg,0.)C(r,1.)C(g,2.)C(b,3.)C(rgb,4.)} pic.twitter.com/04GQ5tj7zd— Narumium (@Nr_Narumium) November 29, 2020
ツイッターで書いた以下の #つぶやきGLSL の作成ログ。
『円で円を作る』をもう一段追加してみる。
今回はテーマなく勢いで始めたので短めです。
#つぶやきGLSL#define L(a)length(a)#define M(t)mat2(cos(t),sin(t),-sin(t),cos(t))
void main(){
vec2 p=5.*(gl_FragCoord.xy*2.-r)/r*M(t),f=floor(p)/5.+.1,g=fract(p)-.5,h=fract(g*5.)-.5;g=g*M(-t*2.)+L(f)*.5;
if(L(f)<1.&&L(g)<.5&&L(h)<.4)gl_FragColor=vec4(L(f),L(f.xx),L(g.xx),1);
} pic.twitter.com/NBF4EimNr6— Narumium (@Nr_Narumium) November 26, 2020
ツイッターで書いた以下の #つぶやきGLSL の作成ログ。
凄くゆるい花のマークを作りたいと思います。
#つぶやきGLSL #geeker
void main(void){
float N=2.*acos(-1.)/5.,j=N/4.+t,c,y=.4+sin(t)*.1;
vec2 p=(gl_FragCoord.xy*2.-r)/r,m=vec2(.0,.9);
for(int i=0;i<5;i++){
c+=step(length(p-vec2(cos(j),sin(j))*.5),y),j+=N;
}
gl_FragColor.rgb=length(p)<y+.1?m.yyx:m.yxx*c;
} pic.twitter.com/HsOUAFqRwV— Narumium (@Nr_Narumium) November 25, 2020