どもです。

最近は受験だの、コンサートだの、色々と大変なイベントが目白押しで、このブログの趣旨を忘れるところでした。
そう、このブログは、様々な情報を公開共有する為の場なのでした。

という事で、久々に。

昨年夏休みはコンピュータビジョン・画像処理ライブラリ集である、OpenCVで染まりました。ヨーロッパ19日間の旅中でもOpenCVをやっておった次第。

さて、今年の夏は少しはカラフルか???と思いきや、またまたOpenCVの波がやってきました。
今年も大学では、Max/MSP上にて稼働する映像処理オブジェクト群、DIPSの新しいバージョンを開発する季節になったようです。
今回は、Max4からMax5へ移行した際に生じるエラーを修正し、同様に崩れたレイアウトを修正、インストーラの整頓(?)が行われるようです。

で、自分は今回初参加なのですが、それ以外の事をやる予定になっています。
途中参加は、イマイチ開発の方向性や目指すべきゴールやら、開発システム等が分からんもので、どのくらい口を出していいかも分からん次第なんです。

で、とりあえず某先生と相談した結果

OpenCVを使用した、コンピュータビジョンプログラム
GLSLによるプログラムのサンプルもしくはチュートリアル
物理シュミレーションエンジン

が夏休みの宿題となりました。


とても大変ですね。
特にOpenCVが大変ですね。
実は、GLSLは作業をだいたいやりまして、サンプルプログラムを10個くらい書きました。
これだけあれば十分じゃないかなぁと思っています。

物理シュミレーションエンジンについては、汎用性にかけるものに関しては開発しない方向でやろうと思います。でも、流体は何かと面白いので、使い勝手は悪いとしても入れておくとアピールになるかなと。
とりあえず、バネ系は使えそうなので入れる。



: GLSLの宿題

GLSLのサンプルプログラムは

1 : Colorの設定(RGBAコントロール)、ブレンドをかけてalpha値を下げると消滅等
2 : Texture Mapping ごく普通の簡単なの
3 : ColorKey 特定の色をthresholdをコントロールして消去。
4 : Lighting ごくごく簡単なの
5 : VertexNoise 物体の頂点座標をサイン波で計算し、波波状態を演出!!
6 : MipMapping この新機能はかなり重要な昨日を担うんじゃないかと思う。DIPSになぜmipmapがないのか長らく疑問だったし。
7 : BumpMap これも魅力的なプログラム。DIPSのチュートリアル、サンプルあさってもbumpは出てこない気がする。
8 : toon 漫画チックな色をつける事が可能
9 : envMap 特殊なテクスチャーマッピング方法。


1: Color設定

多分、一番始めのチュートリアルとしてはこれが最もよいんじゃないかと。

//Vertex
void main(void)
{

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}


//fragment

uniform vec4 color;

void main (void)
{
gl_FragColor = color;


}

色はFragmentファイルの方で設定し、uniformにて宣言された変数は外部からコントロール可能。
vec4と宣言すると、変数colorは4つの値を持つ事になる。
この場合は、
Red
Green
Blue
Alpha
の四つ。
これをgl_FragColorに代入すれば、頂点単位で色を設定する事が可能です。


以下は2Dテクスチャーマッピングのプログラム
//vertex

varying vec2 texture_coordinate;
void main(void)
{

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
texture_coordinate = vec2(gl_MultiTexCoord0);
}


//fragment

uniform sampler2D texture;

varying vec2 texture_coordinate;
void main (void)
{
gl_FragColor = texture2D(texture, texture_coordinate);


}

この場合はgl_FragColorにテクスチャの情報を入れる。

OpenGLの方では、

glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEREST)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEREST)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0 , GL_RGBA, picture)
だけでOKでした。


ここまでくると、点計算を行って、それぞれに対して事なる計算結果を出すプログラムがやりたくなる。
ということでColorKey


//Vertex
void main(void)
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
テクスチャーを張って、テクスチャーの色によってalpha値を設定


//fragment
uniform sampler2D myTexture;
uniform float threshold;

void main (void)
{
vec4 value = texture2D(myTexture, vec2(gl_TexCoord[0]));

if ((value[0] > threshold) && (value[2] > threshold))
discard;

gl_FragColor = value;
}

thresholdを設けて、特定の色を消去。

といった感じ。

下の画像は少し数値を下げたところ。白っぽい部分からどんどん消えていく。

Neoterize-Colorkey1


どんどん虫に食われた感じで、哀れなティーポットさん。
Neoterize-Colorkey2

以下はtoonの効果。色は三段階で変更する事ができます。
Neoterize-toon


envMapの画像。
とても綺麗で光の感じ等がリアル。Rotateでグルグルまわすとガラスに背景が映っているような感じです。
Neoterize-envMap

最高にうにょにょしているVertexNoiseの図。
Neoterize-vertexnoise

Max5上で動くDIPS。
プログラムはBumpMap。
Neoterize-dips4_GLSL