今日はこちらの記事の紹介
Pixelante "Creating Stage3D Textures (tutorial)"
Stage3Dにも慣れてきた(つもり)ところでもう一度テクスチャ周りを復習してみる
---
Stage3DでモデルをレンダリングするのにどのようにしてTextureオブジェクトを準備するかのチュートリアルだ。以下について説明しよう。
/* #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の同期ミスで散々体験したはずなのに忘れてたー。
Author:9ballsyn
ActionScriptについて
最近はMolehill