fc2ブログ

9ballsyndrome

Molehill Stage3D API テクスチャのおさらい

今日はこちらの記事の紹介

Pixelante "Creating Stage3D Textures (tutorial)"

Stage3Dにも慣れてきた(つもり)ところでもう一度テクスチャ周りを復習してみる

 


---

Stage3DでモデルをレンダリングするのにどのようにしてTextureオブジェクトを準備するかのチュートリアルだ。以下について説明しよう。

  1. BitmapDataからTextureの作成
  2. Flash IDEのライブラリの画像からのTextureの作成
  3. GPUにどのTextureを使うのか通知
  4. フラグメントシェーダでテクスチャのサンプリング
  5. テクスチャ使用の最適化

 

 

/* #1. BitmapDataからTextureの作成 */
import flash.display.BitmapData;
import flash.display3D.Context3D;
import flash.display3D.textures.Texture;
 
var bdata:BitmapData; //ここにすでに画像データがあるとする
var context:Context3D; //Context3Dもあるとする
 
var tex:Texture = context.createTexture(bdata.width, bdata.height, "bgra", false); //Context3DにTextureオブジェクトを要求
tex.uploadFromBitmapData(bdata); //GPUにテクスチャをアップロード
 
 
 
/* #2. Flash IDEのライブラリの画像からのTextureの作成 */
import flash.display3D.Context3D;
import flash.display3D.textures.Texture;
import flash.utils.getQualifiedClassName;
 
var context:Context3D; //Context3Dはすでにあるとする
var X:uint, Y:uint; //使う画像の寸法が分かっているとする
 
var c:Class = getDefinitionByName('myImage.png') as Class; //ライブラリから画像ファイルのクラス名を取得 
var tex:Texture = context.createTexture(X, Y, "bgra", false); //Context3DにTextureオブジェクトを要求
t.uploadFromBitmapData(new c()); //ライブラリのクラスからBitmapDataを作り、アップロード
 
/* Note: XとYが分からないなら'new c()'をBitmapData変数に保持して.widthと.heightを使うこともできる */
 
 
 
/* #3 GPUにどのTextureを使うのか通知 */
context.setTextureAt(0, tex); //これでこのTextureはフラグメントシェーダ内で'fs0'として使える。かんたん!
 
 
 
/* #4 フラグメントシェーダでテクスチャのサンプリング */
"tex oc, v1, fs0 <2d,repeat,linear>" //UV座標(v1)を使ってテクスチャ(fs0)をサンプリング
 
//Note: 'clamp'はテクスチャを0から1の範囲のUVにロックするが、'repeat'はテクスチャを面に敷き詰めることができる

 

#5. 最適化Tips:

 

---

まとめ

といった感じかなまあ今更か。

テクスチャは2の乗数じゃないとそもそもエラー出なかったっけ。

 

使うテクスチャの交換は処理が重いのか。ならレンダリングする順番を工夫することも出てくるかもね。

 

 

 

 

サンプリングに使っているテクスチャに出力できない!

と以前嘆いたことがあったが、よく考えたら当然だった。

各ピクセルの処理は並列に実行されるが、時間的にまったく同時に実行されるわけじゃない。

そもそもコア数はGeForce GTX 590でも1024なのだから800*600ピクセルすべてが一辺に実行できるわけではない。

結局余った分は順番に実行されるわけだが、その実行順は基本的に順不同で、毎回変わる。指定できないし、知ることもできない。

各ピクセルがどのUV座標を読み込むかは自由なので、先に実行されたピクセルを後に実行されるピクセルが読み込むような場合だと、後に実行されるピクセルが得られるのは先に実行したピクセルの演算結果であり、意図した値にならない。

だからサンプリングに使うテクスチャにそのまま演算結果を上書きするようなことはできないわけだ。

複数のピクセルが同じテクスチャの同じUVを参照することもあるもんね。

 

CUDAの同期ミスで散々体験したはずなのに忘れてたー。

 

 

スポンサーサイト



  1. 2011/08/01(月) 17:40:39|
  2. Molehill Stage3D
  3. | トラックバック:0
  4. | コメント:0
<<Molehill Stage3D API 入門 Stage3Dで霧表現 | ホーム | Molehill Stage3D API リファレンスカード>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://9ballsyndrome.blog.fc2.com/tb.php/31-28c0c8a6
この記事にトラックバックする(FC2ブログユーザー)