2009年06月29日

ARToolKit_MMDについて

久々に日記カテゴリです。

今日も元気にニコニコ動画を見ていたら、いつの間にかARToolKit_MMDなるものがありました。

http://ch.nicovideo.jp/community/co38890

コミュニティ動画の一例


ARToolKitとかPTAMとかマッチムーブとかAR流行ってるんですかね。先週行ったIVR展でもいくつかあった気がしますし。

MMDのVer.5β試してみましたが、面白いですね。物理シミュ常時ONにしてセンターボーン動かすとツインテールが荒ぶります。MMDでUFOキャッチャーしている動画などもありましたしPhunの3D版みたいになっていくんですかね。

まーこちらはゆっくりプログラミングしていきますかね。

web拍手 by FC2
posted by シンドラー at 20:15 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年06月25日

VMDファイルの再生について

というわけでVMDファイルのモーションデータで試してみました。

実行結果



ひざの向きがおかしいですね。IKを優先するのか根元のボーンの姿勢を優先するのか、その辺も微妙ですね。

IK先の情報も使ってないし、IK2値も使ってないのでMikuMikuDanceと同様の動きにはまだまだ遠いです。

まぁ骨だけ見てもアレなのでとりあえずこのままビューアのほうに実装していきたいと思います。

web拍手 by FC2
posted by シンドラー at 02:53 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月23日

CCD-IKについて

多自由度のIKを計算するためには数値計算で求めるためにヤコビアンとかやらないといけないかなと思いましたが、参考サイトのPMDファイルのフォーマットを見てみると、IK1値が再帰計算回数ということですのでCCD-IKやParticle-IKなど、再帰計算するアルゴリズムだと思われます。IK2値はとりあえず置いておいてCCD-IKを試してみたいと思います。

参考文献
http://blog.goo.ne.jp/torisu_tetosuki/e/445cbbbe75c4b2622c22b473a27aaae9
http://www.tmps.org/index.php?CCD-IK%20and%20Particle-IK
http://monsho.hp.infoseek.co.jp/dx/dx48.html

実行結果



参考サイトを見るとわかりやすいですが、面白い計算方法ですね。実装も簡単そうですし。
// 注目ジョイント、エフェクタのジョイント番号、目標座標、繰り返し回数、残り繰り返しボーン数、最大ボーン数
void CFigure::ccdIKSolver(CJoint *joint, int effector, btVector3 &targetPos, int numIteration, int numBones, int numMaxBones)
{
// エフェクタのワールド座標
btVector3 effectorPos = m_vecJoints[effector]->m_vWorldPosition;
// 注目ジョイントのワールド座標
btVector3 jointPos = joint->getParent()->m_vWorldPosition;

// 注目ジョイントからの座標系に変換するための行列
btMatrix3x3 invCoord = joint->getParent()->m_mWorldRotation.inverse();

// ターゲット座標をローカル座標系に変換
btVector3 localEffectorPos = invCoord * (effectorPos - jointPos);
btVector3 localTargetPos = invCoord * (targetPos - jointPos);

// (1) 基準関節→エフェクタ位置への方向ベクトル
btVector3 basis2Effector = (localEffectorPos).normalized();
// (2) 基準関節→目標位置への方向ベクトル
btVector3 basis2Target = (localTargetPos).normalized();

// (1)を(2)の位置に向ける回転行列の計算
float rotationDotProduct = basis2Target.dot(basis2Effector);
float rotationAngle = acos(rotationDotProduct);
// 角度が小さい時は処理しない
if (rotationAngle > 1.0e-5f)
{
// 外積が回転軸
btVector3 rotationAxis = basis2Effector.cross(basis2Target);
rotationAxis.normalize();
// 回転軸と回転角度からクォータニオンを生成
btQuaternion rotationQt;
rotationQt.setRotation(rotationAxis, rotationAngle);
// クォータニオンから回転行列を生成
btMatrix3x3 rotationMatrix;
rotationMatrix.setRotation(rotationQt);
// 注目ジョイントの姿勢を更新
joint->getParent()->m_mLocalRotation *= rotationMatrix;
// 注目ジョイントからすべての子ジョイントの位置を更新
updateAllPosition(joint->getParent());
}

// 再帰/終了処理
numBones--;
if (numBones == 0)
{
numIteration--;
// 繰り返し回数繰り返したら終了
if (numIteration == 0)
{
return;
}
// ボーンの数とエフェクタのジョイントに初期化して再帰計算
numBones = numMaxBones;
ccdIKSolver(m_vecJoints[effector], effector, targetPos, numIteration, numBones, numMaxBones);
}
else
{
// エフェクタからボーンの数だけ親ジョイントに向かって再帰計算
ccdIKSolver(joint->getParent(), effector, targetPos, numIteration, numBones, numMaxBones);
}
}
この関数もほぼ参考サイトそのままですね。困ったものです。しかしまぁこれで1リンク(足先)でも2リンク(足)でも3リンク(ネクタイ)でも5リンク(髪)でもIKできるようになりました。結局IK値2を使っていないのが気になりますが・・・。

次はPMDファイルから読み込んだIK情報を使ってVMDファイルを再生ですね。うまく動くといいですが・・・。

web拍手 by FC2
posted by シンドラー at 21:37 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月22日

逆運動学(IK)について

以前と同じようにムービーメーカーでWMVに変換してアップロードしてるのですがなぜか動画が再生されない気がしますね。その場合はDOWNLOADボタン押すと見れると思います。

今日からのんびりIKについてやっていきたいと思います。

参考文献
http://www.morikita.co.jp/mkj/84691.html
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-20058-2
http://www.tmps.org/index.php?TMPSwiki

まず1本のリンクのIKです。MikuMikuDance的には足首→つま先のIKです。
これは特に問題はありませんね。親のワールド座標から目標ワールド座標へのベクトルと、親のワールド座標から子のワールド座標への初期オフセットベクトルを使って、目標のクォータニオンを計算して、必要があれば現在のクォータニオンから目標のクォータニオンまでslerp関数を使って補間する感じです。
void CJoint::updateRotationByIK(btVector3 &mPos)
{
// 親ノードが存在する場合
if (getParent() != NULL)
{
// 目標のクォータニオン
btQuaternion targetQt;
// 初期オフセットベクトル、目標ベクトル、回転軸
btVector3 initDir, targetDir, vaxis;
// 回転角度
btScalar angle;
// 初期オフセットベクトル
initDir = m_vLocalPosition.normalized();
// 目標ベクトル=マウスクリックワールド座標−親ノードのワールド座標
targetDir = (mPos - getParent()->m_vWorldPosition).normalized();
// 初期と目標が同じ場合は回転させる必要なし
if (initDir == targetDir)
{
return;
}
// 回転角度=目標ベクトルと初期オフセットベクトルの内積のarccos
angle = acos(targetDir.dot(initDir));
// 回転軸=目標ベクトルと初期オフセットベクトルの外積
vaxis = initDir.cross(targetDir);
// 回転軸と回転角度からクォータニオンを作成
targetQt.setRotation(vaxis, angle);
// 親のローカル姿勢を更新
getParent()->m_qLocalRotation = targetQt;
getParent()->m_mLocalRotation.setRotation(targetQt);
}
}
実行結果



ここでは補間はしていません。

続いて2本のリンクのIKです。2本のリンクというと、右足→右ひざ→右足首の部分になります。影響度の値を何に使っているのかよくわかりませんね。MikuMikuDanceで右足首IKを動かした感じから行くと、右足3自由度、右ひざ1自由度(x軸回転)といった感じでしょうか。

参考文献によると、逆運動学には解析的に解く方法と数値的に解く方法があるみたいです。MikuMikuDanceがどちらの方法でやっているのかわかりませんが、2本のリンクぐらいなら解析的に解いたので良さそうなのでそちらでやってみます。三角関数で解けるみたいなので。

左足の場合

ik_fig001.jpg
void CJoint::updateRotationByIK2(btVector3 &mPos)
{
// 親の親ノードが存在する場合
if (getParent() != NULL)
{
if (getParent()->getParent() != NULL)
{
// 目標のクォータニオン
btQuaternion targetQt[2];
// 回転角度
btScalar alpha, beta, gamma;
// ボーンの長さ
btScalar boneLength[2], targetLength, maxLength;
boneLength[0] = getParent()->m_vLocalPosition.length();
boneLength[1] = m_vLocalPosition.length();
targetLength = (mPos - getParent()->getParent()->m_vWorldPosition).length();

// 股の姿勢や足首の位置は考えずに、3つの関節が作る三角形の角度を求める
if (targetLength > 0)
{
// 目標地点が到達可能範囲外の場合は到達可能範囲内に収める
maxLength = boneLength[0]+boneLength[1];
if (targetLength > maxLength)
{
targetLength = maxLength;
}
// 三角形 股→膝→足首を考えると、余弦定理により
// C^2 = A^2 + b^2 -2ABcos(膝の回転角度)なので
gamma = acos((boneLength[0]*boneLength[0]+boneLength[1]*boneLength[1]-
targetLength*targetLength)/(2.0*boneLength[0]*boneLength[1]));
// 三角形の下端の角度をαとすると、正弦定理により
alpha = asin((boneLength[0]*sin(kPi-gamma))/targetLength);
// 残りの角βは三角形の内角より
beta = kPi - (alpha+gamma);

// 股の姿勢や足首の位置を考えない場合、
// 膝の位置は初期股→膝ベクトルをx軸周りに-β回転させた位置
targetQt[0].setRotation(btVector3(1, 0, 0), -beta);
// 足首の位置はx軸周りにπ-γ回転させた位置
targetQt[1].setRotation(btVector3(1, 0, 0), kPi-gamma);

// 股の姿勢の更新(IKの部分)
getParent()->getParent()->m_qLocalRotation = targetQt[0];
getParent()->getParent()->m_mLocalRotation.setRotation(targetQt[0]);
// 膝の姿勢の更新(IKの部分)
getParent()->m_qLocalRotation = targetQt[1];
getParent()->m_mLocalRotation.setRotation(targetQt[1]);

// 股の姿勢をマウスの位置から更新する
btMatrix3x3 tempMat;
// 股の姿勢は股のワールド座標→マウスクリック座標
tempMat.setRotation(getParent()->getRotationByIK(mPos));
// 現在のIKの姿勢に股の姿勢を掛ける
getParent()->getParent()->m_mLocalRotation *= tempMat;
}
}
}
}
実行結果



VMDファイルに記述されている足の姿勢とIKによる姿勢の混ぜ具合なども調べないといけないですね。

後はネクタイとか髪の毛とかリンク数が多い場合も実装しないといけませんね。それとIK影響度の使い方も。それはまた今度ということで。
web拍手 by FC2
posted by シンドラー at 18:58 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月20日

左手系と右手系について

シェーダ言語は置いておいて、VMDファイルの再生に戻っていこうと思います。今回はその準備段階ということで、左手系と右手系の変換についてメモしておこうと思います。

参考サイト
http://wiki.livedoor.jp/atushiinliv/d/%BA%B8%BC%EA%BA%C2%C9%B8%B7%CF%A4%C8%B1%A6%BC%EA%BA%C2%C9%B8%B7%CF%B4%D6%A4%CE%CA%D1%B4%B9
http://forte.at.webry.info/200506/article_8.html
http://www.geometrictools.com/Documentation/LeftHandedToRightHanded.pdf

MikuMikuDanceは左手系で、Bulletは右手系ですので、読み込んだデータを左手系から右手系に変換する必要があります。

メッシュ情報:Z座標の符号の反転および頂点インデックスの順番変更
(-Zにしただけではインデックスの順番が時計回り(裏)になってしまう?)

モーション情報:位置座標はZ座標の符号の反転、回転座標はZYXオイラー角のX軸及びY軸回転の符号を反転
(クォータニオン(x,y,z,w)の場合は(-x,-y,z,w)?)

VMDConverterで読み込んだデータは位置とクォータニオンのデータですので、Bullet使って右手系に変換する場合には次のようにします。たぶん。

btQuaternionを使う場合
btQuaternion tempQt;
tempQt.setValue(-vmd_qt[0], -vmd_qt[1], vmd_qt[2], vmd_qt[3]);
tempQt.normalize();
btMatrix3x3を使う場合
btQuaternion tempQt;
tempQt.setValue(vmd_qt[0], vmd_qt[1], vmd_qt[2], vmd_qt[3]);
btMatrix3x3 tempMat;
tempMat.setRotation(tempQt);
btVector3 euler;
tempMat.getEulerZYX(euler[2], euler[1], euler[0]);
euler *= btVector3(-1.0, -1.0, 1.0);
tempMat.setEulerZYX(euler[0], euler[1], euler[2]);
BulletのバージョンによってgetEulerZYX関数があったりなかったしますので気をつけてください。私の場合は2.74使っています。

ついでにgetEulerZYXとsetEulerZYXで引数の順番が違う気がするのはなぜなんでしょうね。

実行結果



マウスやキーボードで関節の角度は変更できるようにしています。オイラー角で回転させると不思議現象が起こりますね。

VPVP Wiki経由で歩きモーション(walk.vmd)を使わせていただいております。

足の動きがおかしいのはIKを実装していないからです。関節角度的にはMikuMikuDanceで確認したところ合ってましたので。たぶん。

ご覧の通りたぶんが多いので間違っている可能性が高いのでお気をつけください。
web拍手 by FC2
posted by シンドラー at 23:30 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月17日

マウスで視点変更

いまさらですがマウスで視点変更できるようにしました。

参考サイト
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321
http://www.tmps.org/index.php?%A5%AD%A5%E3%A5%E9%A5%AF%A5%BF%A4%CE%A5%B9%A5%B1%A5%EB%A5%C8%A5%F3%B9%BD%C2%A4

実行結果

以前と同様にハッチブログ様のはちゅねモデルを使用させていただいております。
http://blog.goo.ne.jp/hachi800/e/e8ecbd2f8f41195af7a33c1b28d6e79e



かなり適当に実装しているので操作性は微妙です。
カメラを近づけるとジャギーがとっても目立ちますね。
続きを読む
web拍手 by FC2
posted by シンドラー at 04:35 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月15日

シャドウマッピングについて

やっとシャドウマッピングです。

実行結果



感想としては色々怪しいなぁということとエイリアス気になるなぁということです。
参考サイトを参考にPerspective Shadow MapsとかPercentage Closer Filteringとか試してみますかね…。

参考サイト
http://asura.iaigiri.com/OpenGL/gl46.html
http://www.flashbang.se/index.php?id=35
http://alb.hp.infoseek.co.jp/

というかかなり寄り道してしまっているので、当初の予定に戻ってIKの実装に移った方がいい気がしてきました。

続きを読む
web拍手 by FC2
posted by シンドラー at 17:06 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月14日

プロジェクティブテクスチャについて

シャドウマッピングについて調べていると、テクスチャ座標系についてもちゃんと勉強しておいた方がいい気がしてきました。

いままで精々glTexCoord2fとかでテクスチャのs,t座標を指定していたぐらいで、いまいちよくわかっていませんでした。

というわけでプロジェクティブテクスチャを通じてテクスチャ座標系についてちょっと勉強したいと思います。

参考ページ
http://asura.iaigiri.com/OpenGL/gl45.html
http://alb.hp.infoseek.co.jp/opengl_texture_projection.html
http://wiki.livedoor.jp/mikk_ni3_92/d/Cg::%A5%C6%A5%AF%A5%B9%A5%C1%A5%E3%C5%EA%B1%C6
http://developer.nvidia.com/object/Projective_Texture_Mapping.html

glMatrixMode(GL_TEXTURE);でテクスチャ座標系の設定ができるようですね。ここで設定した座標系はVertex Shaderの方でgl_TextureMatrix[0]といった具合に取得できるようです。

実行結果



参考ページが参考になったので多分できていると思います。結局ちゃんと理解できていないので怪しい部分も多いですが。困ったものです。

PMDファイルを読み込んでFBOに描画して、それをテクスチャとして床とキューブに投影しています。

FBOやテクスチャ座標系について少しずつわかってきたので、そろそろ主目的のシャドウマッピングを試したいと思います。

web拍手 by FC2
posted by シンドラー at 15:02 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月13日

Frame Buffer Objectについて その4

というわけで、PMDファイルを表示するプログラムを作り直そうかと思っています。

とりあえずモデル表示まではできました。

FBO2枚使ってガウシアンフィルタ+前回のプチ残像を出しています。エイリアスが結構減った気がしないでもないです。

まぁこの辺はわざわざ自分で実装しなくても、グラボによってはnVidiaの設定等でできるはずなんですけどね。

実行結果



画質が悪いのと離れているのであまり違いがわからないですね。

後、以前モーフィングが少しずれていたので下記ページを参考にほぼ30fpsにしてみたところ、殆どずれなくなりました。めでたしめでたし。

http://d.hatena.ne.jp/kaorun55/20081215/1229346934

web拍手 by FC2
posted by シンドラー at 19:31 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月12日

Frame Buffer Objectについて その3

下記ページを参考にFBO2枚使ってモーションブラーっぽいのをテストしてみました。

http://www.flashbang.se/index.php?id=19

実行結果

ティーポットを適当に回転させています。

blur_test_001.JPG

参考ページみたいに綺麗に出てないですね。まぁ参考にしただけでその通りにやってないからだと思いますが。

web拍手 by FC2
posted by シンドラー at 00:16 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月10日

Frame Buffer Objectについて その2

今回はちょっとソースコードを整理してFBOとかマルチテクスチャとか混乱しないように修正しました。

実行結果



床には普通にファイルから読み込んだテクスチャを貼り付けて、キューブにはFBOにレンダリングしたティーポットをFragment Shaderで無理矢理貼り付けてます。
    // ピクセルの座標
int x = int(gl_FragCoord.x);
int y = int(gl_FragCoord.y);
// FBOをtexture0にレンダリング済み
// widthとheightはウィンドウサイズ。glUniformでOpenGLから渡している(渡さなくても取得可能?)
gl_FragColor = texture2D(texture0, vec2((float)x/width, (float)y/height));
こうすると視点を変えようが形状を変えようがレンダリング結果が変わりません。

シェーダ言語も試してみるとなかなか面白いですね。OpenGLに任せていたところを自分で実装しないといけなくなって、どこの知識が足りていないのかとかが良くわかります。CGの本に載っている光源の計算式とかどこで使うのかなーと思っていましたが、こういうところで使えるんですね。

後はテクスチャ座標系とかが全然わかっていないのでその辺もこれから勉強していこうかと思います。

今更ながらGLSLの仕様書とチートシートです。シェーダ言語はコードアシスト機能とか効きそうにないのでチートシートは役に立ちますね。

http://www.opengl.org/documentation/glsl/
http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf

ついでにGPU Gems 3とかもフリーで読めちゃうんですねぇ。英語ですが。
http://developer.nvidia.com/page/home.html

とても良さそうなチュートリアルを見つけたので、今後は下記ページのOpenGL Tutorialsを参考にしつつ勉強しようかなと思います。

http://www.flashbang.se/index.php

プロジェクティブテクスチャとかシャドウマップとかそろそろやりたいですね。
web拍手 by FC2
posted by シンドラー at 23:21 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月08日

Frame Buffer Objectについて

MikuMikuDanceにBulletが組み込まれるようですね。素晴らしい事です。



まぁそれはそれとして、マルチテクスチャの使い方の勉強をしつつシャドウマッピングについて調べてみると、Frame Buffer Objectというものが良さそうでした。

VBO、PBO、FBOとあり、それぞれ便利そうですね。

以下参考ページ
http://wiki.livedoor.jp/mikk_ni3_92/d/%b4%f0%cb%dc%ca%d410
http://oshiro.bpe.es.osaka-u.ac.jp/people/staff/imura/computer/OpenGL/framebuffer_object/disp_content
http://alb.hp.infoseek.co.jp/
http://asura.iaigiri.com/OpenGL/gl16.html
http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060715

というわけで試しにFBOを使ってみました。

実行結果

左から通常−ガウシアン−ラプラシアンです。

glsl_normal_001.JPGglsl_normal_002.JPGglsl_normal_003.JPG

texture0に一旦レンダリングしておいて、GPU側でラプラシアンとかガウシアンフィルタかけてそのまま出力しています。アンチエイリアスに使えるかなーと思ったのですが、よく考えると何か違う気がしますね。

テクスチャに1回レンダリングして、そのテクスチャを画面に出力するという2段階のレンダリングをしたかったのですが、1回目のレンダリングなのか2回目のレンダリングなのかをGPU側でどうやって知るのかよくわかりませんでした。仕方がないのでuniformを使ってOpenGLからGPU側に値を渡しました。

参考ページ
http://www.arakin.dyndns.org/glsl_qualifier.php

// fragment shader
uniform int renderNum;
void display()
{
int num = glGetUniformLocation(shdProg, "renderNum");
glUniform1i(num, 0);

// FBO使ってテクスチャにレンダリング

glUniform1i(num, 1);

// ここから普通のレンダリング

glutSwapBuffers();
}
後はフラグメントシェーダ側でrenderNumの値を見て条件分岐やっております。
web拍手 by FC2
posted by シンドラー at 23:20 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月04日

マルチテクスチャの勉強

シェーダ言語の勉強を始める前に、影付けをやろうとしていた時に下記の知識が足りないなと思ったので、その辺もついでに勉強していきたいと思います。
  1. デプスバッファの使い方
  2. ステンシルバッファの使い方
  3. マルチテクスチャの使い方
この辺がわかっていないとうまくGPUの機能を引き出せない気がしましたので。

まずはマルチテクスチャの勉強です。色々使い道があるはずです。たぶん。

というわけで下記ページ等を参考に試してみました。
http://wiki.livedoor.jp/mikk_ni3_92/d/%c8%af%c5%b8%ca%d401%3a%3a%a5%de%a5%eb%a5%c1%a5%c6%a5%af%a5%b9%a5%c1%a5%e3
http://marina.sys.wakayama-u.ac.jp/~tokoi/oglarticles.html

実行結果

動画にすると画質がアレですが、スクリーンショットだけだとわけがわからない感じです。
鏡面反射光の緑色が目立っちゃってますね。

画像はPMDファイルのテクスチャを使用させていただいております。問題がありましたらお知らせください。



256x256の三角メッシュにテクスチャを2枚重ねて貼り付けています。

光の方向ベクトルと頂点の法線ベクトルの内積を見て、その値を元にテクスチャをmixしています。まだCgの勉強をしていないのでGLSLでやっています。

いまいちよくわからないのですが、次はデプスバッファの勉強でもしようと思います。


web拍手 by FC2
posted by シンドラー at 20:12 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2009年06月03日

シェーダ言語(GLSL)について

というわけで、シェーダ言語を試してみました。何かイメージと色々違っていましたね。食わず嫌いはいけませんということでしょうか。

感想としては、使用する準備などは意外と簡単ですが、アルゴリズムを自分で実装するのは大変そうだと思いました。

下記ページ等を参考に試してみました。フォンのシェーディング+ちょっとだけカートゥーンぽいレンダリングです。

http://www.ozone3d.net/tutorials/glsl_lighting_phong.php
http://www.arakin.dyndns.org/glsl_cartoon.php

GUIが真っ黒になったりアンチエイリアスしたいけどやり方がわからなかったりまだまだ思い通りにはいきませんね。

今回はGLSLで試しましたが、適当に本を買ったらCg言語ばっかりだったので、Cg言語にうつろうかと思います。

実行結果



光の反射はフォンのモデルのほうがはっきりしている気がしますが、それ以外はあまり変わらない気もしますね。

使いこなせていないだけだと思いますが。



web拍手 by FC2
posted by シンドラー at 21:46 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。