- 2024年10月
- 2021年5月
- 2020年8月
- 2020年6月
- 2020年5月
- 2019年1月
- 2018年8月
- 2018年6月
- 2018年5月
- 2018年3月
- 2018年1月
- 2017年12月
- 2017年11月
- 2017年10月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2016年11月
- 2013年9月
- 2013年8月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年11月
- 2012年10月
- 2012年9月
- 2012年6月
- 2012年5月
- 2012年4月
- 2012年2月
- 2011年7月
- 2011年5月
- 2011年4月
- 2011年2月
- 2010年12月
- 2010年11月
- 2010年10月
- 2010年9月
- 2010年8月
- 2010年7月
- 2010年6月
- 2010年5月
- 2010年4月
- 2010年3月
- 2010年2月
- 2010年1月
- 2009年12月
- 2008年2月
- 2008年1月
- 2007年12月
- 2007年5月
- 2007年4月
- 2007年3月
- 2007年2月
OpenGL ES 2.0 プログラミングガイド / magicien
ふと思い出してこの本を開いてみたところ、WebGLでのClipPlaneの実現方法が載っていた。ES 1.1にはあったけど、2.0で無くなった機能をどう実装するか、という話が一通り載っていて、シェーダのプログラムもコピペしてそのまま使えるレベル。
そのうちの一つが、ユーザ定義クリップ面の話。
クリップ面の式を
Ax + By + Cz + D = 0としたとき、
v_clipPlane = (A, B, C, D)として次のシェーダを書けばOK。
( (A, B, C)はクリップ面に対する法線、Dは原点(0, 0)とクリップ面との距離になる。
例えば、Y=0平面をクリップ面としたいなら、v_clipPlane=(0,1,0,0))
頂点シェーダ:
uniform vec4 v_clipPlane; uniform mat4 matViewProjection; attribute vec4 rm_Vertex; varying float v_clipDist; void main(void) { v_clipDist = dot(rm_Vertex.xyz, u_clipPlane.xyz) + u_clipPlane.w; gl_Position = matViewProjection * rm_Vertex; }
フラグメントシェーダ:
precision mediump float; varying float v_clipDist; void main(void) { if(v_clipDist < 0.0) discard; gl_FragColor = vec4(0.5, 0.5, 1.0, 0.0); }
頂点(rm_Vertex)毎にクリップ面との距離(v_clipDist)を計算しておく。
v_clipDist が 0 より小さい点はクリップ面の裏側にあることになるため、描画しない(discard)。
もっと難しい計算が必要だと思ったけど、恐ろしく簡単に実装できた。
この記事のURL: https://darkhorse2.0spec.jp/163/
2012/05/19(Sat) 22:44:29
床面反射 / magicien
馬鹿は風邪をひかないと言いますが、エイプリルフールで患った病がこじれた挙げ句、こんな感じになりました。このページを参考にして実装。
床面反射は今のところ、y=0平面で反射した結果(y軸のスケールを-1にした結果)を描画しているだけ。
ただ、それだと床面の枠からはみ出してしまうので、stencilを使って床があるところだけ描画するようにする。
WebGLでステンシルバッファを使う場合は、getContextをするときにオプションを指定する必要がある。
var canvas = $('canvas'); var context = canvas.getContext('webkit-3d', {stencil: true});あとはOpenGLと同様。
以下、今回使った描画の流れの個人的メモ。
1.Color、Depth、Stencilの各バッファをクリア
2.Color有効、Depth有効、Stencil有効(Always 1に上書き)にして床面を描画
3.Color有効、Depth有効、Stencil有効(Always 0に上書き)にして床面以外を描画
4.Color無効、Depth有効(rangeを1〜1に指定)、Stencil有効(1の箇所のみ描画、値は変更せず)にして床面を描画
5.scale(1, -1, 1)でY=0平面で反射、カリング指定をしている場合はFrontとBackを入れ替え
6.Color有効(blendFunc(ONE、ZERO) →元のAlpha値を気にせず上書き)、Depth有効、Stencil有効(1の箇所のみ描画、値は変更せず)にして床面以外をRGBAそれぞれの値を70%にして描画
7.scale、カリング指定を元に戻す
8.Color有効(blendFunc(ONE_MINUS_DST_ALPHA, DST_ALPHA)→元のAlpha値が100%なら描画しない、70%ならAlpha30%で描画)、Depth有効、Stencil有効(1の箇所のみ描画、値は変更せず)にして床面を描画
問題点
・ClipPlaneが使えないので、床面の裏側のオブジェクトが描画されてしまう。自力で実装するか...
・6&8のStencilの指定方法は改善できそう。
・6のAlpha値の指定が悪いらしく、Alpha値を持つテクスチャがうまく描画されない
・そもそもAlpha値が1.0じゃない部分はzソートした上で最後に描画しないといけない
タグ:
この記事のURL: https://darkhorse2.0spec.jp/161/
2012/05/10(Thu) 02:11:55
GWのあれこれ / magicien
ゴールデンウィークは引きこもりを解消すべく、いろいろ出かけましたが、そのうちの一つとして東京スカイツリーを見てきました。見てきたといっても、関係者しか中に入れないようなので、外から眺めてきただけですが。
東京スカイツリー周辺は再開発が進んでいるのだろうと思いきや、そんな雰囲気はありませんでした。
今回入れなかったツリーの1階部分がこれから充実していくのかもしれません。
上野から浅草を通ってスカイツリーに行く途中に立ち寄ったのが、神谷バーというところ。 昼過ぎでしたが恐ろしい程繁盛しており、お好きな席にどうぞ、と言われても空席が無くてしばらく立ち往生。見かねたおじさんに手招きされて、もうすぐ立つからここに座りなよと席を譲ってもらいました。
前に読んだ本に同じような名前の飲み物が出てきたような気がすると思い、電気ブランなるものを注文しました。
見たところ梅酒のようで甘い印象でしたが、飲んでみると普通に強いお酒で、ブランデーに少しサイダーを混ぜたような感じ。デンキブランFIXというものもありましたが、こちらは甘くてさわやかなカクテルでした。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/160/
2012/05/06(Sun) 22:30:32
【2012年4月1日】I.Q REVENGE【発売】 / magicien
もう4月1日も19時を回りそうですが、私が制作に携わったゲームのCMをご紹介します。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/159/
2012/04/01(Sun) 18:51:18
WebGLサンプルページ / magicien
サンプルページへのリンクを張り忘れていたので。WebGLサンプルページはこちら↓
http://darkhorse2.0spec.jp/dh3d/sample/
さっき改めて動作確認したら、Firefoxの描画が速くてきれいになってた...。きれいさはまだSafariやChromeには追い付いてないけど、速さは互角かも。ただChromeはsubstringの遅さをなんとかして欲しい。Opera Nextはちょっと前のFirefoxくらい。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/158/
2012/02/12(Sun) 01:59:31
WebGL動画その6 / magicien
ようやくの公開。やり残したことは山ほどあるけど、そんなことを言っていると一生公開できないので、とりあえず。
いつのまにか英語版の方にも動画公開できるようになっていたので、ついでに公開しておきました。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/157/
2012/02/10(Fri) 02:07:04
QuickTime Player Xの「画面収録」をFinal Cut Pro 7に取り込む / magicien
Macで画面キャプチャして動画を作成しようと思ったときに毎回分からなくなるのでメモ。QuickTime Player X で「新規画面収録」を使って画面キャプチャを撮った後、Final Cut Pro に取り込もうとすると、エラーが出て読み込めない。
理由は、下のリンク先によると、「可変フレームレートは取り扱え」ないから、らしい。
http://oshiete.goo.ne.jp/qa/6160886.html
解決方法は、QuickTime Proで固定フレームレートに変換すれば良いらしいけど、QuickTime Player Xにそんな機能は無い、気がする。あるいは、画質を犠牲にすれば、他のフォーマットに変えてしまうことで固定フレームレートになるかもしれない。
ただ、Final Cut Pro 7をインストールすると、QuickTime Player 7が勝手にPro化されるみたいなので、「QuickTime7」で検索して、アップルのサイトからQuickTime Player 7をダウンロード。
すると、特に何もしなくても、QuickTime Player 7がPro版になっている。すばらしい!
あとは、上のリンク先に書いてある通りに動画を変換する。
[ファイル]-[書き出す]を選択。 「書き出し」項目は「ムービーからQuickTimeムービー」とします。 [オプション]ボタンをクリック。 「ビデオ」項目内の[設定]ボタンをクリック。 圧縮の種類を「Apple Intermediate Codec」に、フレームレートを29.27に変更。 圧縮プログラムは「その他」のままでOK。 「ビデオ」項目内の[サイズ]ボタンをクリック。 「現在のサイズ」として保存してする。
で、Final Cut Proで読み込めるファイルの出来上がり。
Final Cut Pro Xを入れると、QuickTime Player X がPro版になるんだろうか...。
まぁ、バージョンアップに追従していけるほどリッチじゃないです、はい。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/156/
2012/02/06(Mon) 00:10:07
日本優勝! / magicien
ワールドカップ優勝ってまじですか!PK戦は神懸かってましたね!
劣勢での粘りとか...ドラマか漫画かと思うような展開でした。
6月にWebGLソース公開だったはずが、延長戦に突入した私も見習いたいです。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/155/
2011/07/18(Mon) 07:12:20
WebGL動画その5 / magicien
その5は1月公開予定でしたが...気づいたら、こんな時期になってました。
音楽無しでMMDは成り立たないだろう、ということで付けてみました。
再生開始時にモーションと音楽の同期をして、あとは放ったらかしなので、
再生が進むにつれ、ずれていくかなぁと思ったけど、意外と大丈夫でした。
あとはソース公開に向けて、いろいろと準備を進めていきます。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/154/
2011/05/22(Sun) 01:32:54
FileオブジェクトからAudio読み込み / magicien
投稿が全くなかったので挫折したかと思われたかも知れませんが、実はプログラミングを続けています。音声ファイルをドラッグ&ドロップしたときに、そのファイルをAudioオブジェクトで再生したい場合。
var audio = new Audio(); function droppedFile(file) { var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function() { audio.src = reader.result; }; }こんな感じでAudioオブジェクトにFileオブジェクト(上の"file")を読み込める。
ドロップされたvmdファイルを読み込む部分は実装完了。
pmdファイルは、テクスチャファイルがあったりして複数ファイルの読み込みに対応しなければならず、まだ実装できていません。
公開すると言いながら、なかなかソース公開できずにいますが、そろそろ覚悟を決めようかと思ってます。
5月はゴールデンウィークも含め、既にスケジュールで埋め尽くされていて正直かなり厳しいですが...
ブラウザの実装も大分進んできたみたいなので、ちょっと急ぎます。
タグ:
この記事のURL: https://darkhorse2.0spec.jp/153/
2011/04/27(Wed) 00:16:41