Qt Developer Days 2011 in Munich Day2 セッション @task_jp さんまとめ

ドイツのミュンヘンで開催中のQt Developer Days 2011 Day2 技術セッションを@task_jpさんが実況した内容をまとめました。アジェンダはこちら http://goo.gl/cea7a Scene Graph, Qt Quick 2.0 などなど盛りだくさん。
5
Tasuku Suzuki @task_jp

色々悩んだ結果やっぱり SceneGraph で待機 #qtdd11

2011-10-25 20:00:28
Tasuku Suzuki @task_jp

Qt 5 のリリースに備えて QML SceneGraph 向けのカスタムアイテムを実装する知識を得ようという感じかなw #qtdd11

2011-10-25 20:05:30
Tasuku Suzuki @task_jp

Qt Quick 2 は OpenGL の上の SceneGraph という描画スタック上で動作する。以前の複雑な描画スタックよりもシンプルでとても早い #qtdd11

2011-10-25 20:06:59
Tasuku Suzuki @task_jp

パフォーマンスの向上、アニメーションが高速、3D をサポート(?)、シェーダーによるエフェクト #qtdd11

2011-10-25 20:08:21
Tasuku Suzuki @task_jp

カスタムエレメントの実装は若干難易度が上がる、QPainter の API はない。 #qtdd11

2011-10-25 20:09:22
Tasuku Suzuki @task_jp

Qt Quick 2 への移行:qmlviewer -> qmlscene、QDeclarativeView -> QSGView(SG の部分は最近変わった)、Qt Quick 1.0 -> 2.0 #qtdd11

2011-10-25 20:10:38
Tasuku Suzuki @task_jp

Qt Quick 1.0 のカスタムエレメント(QDeclarativeItem)を 2.0 化する #qtdd11

2011-10-25 20:11:21
Tasuku Suzuki @task_jp

カスタムエレメントの例はドーナツwww #qtdd11

2011-10-25 20:12:10
Tasuku Suzuki @task_jp

QDeclarativeView -> QSGPaintedItem に変更、paint 関数はシンプルで QPainter * だけを引数にとる、setFlag で ItemHasNoContents true -> ItemHasContents false #qtdd11

2011-10-25 20:14:23
Tasuku Suzuki @task_jp

Scene Graph にはメインスレッドと描画スレッドがある #qtdd11

2011-10-25 20:15:31
Tasuku Suzuki @task_jp

ノードは Transform、(Opacity)、(Clip)、Group(子要素のルートノード)、そして描画ノードがある #qtdd11

2011-10-25 20:17:04
Tasuku Suzuki @task_jp

描画ノードのアップデートのデモ:QSGPaintItem -> QSGItem、QSGTexture クラスを仕様。paint() の変わりに updatePaintNode() メソッドを実装。 #qtdd11

2011-10-25 20:23:30
Tasuku Suzuki @task_jp

updatePaintNode は与えられたパラメータで既存のノードを変更し、変更後のノードを買えす。texture は最初は QPainter で最初に作成する。更新は QSGSimpleTextureNode を使う。インスタンスが無ければ自分で作る。 #qtdd11

2011-10-25 20:25:53
Tasuku Suzuki @task_jp

ここまでのところ、コードは QtQuick 1.0 から QtQuick 2.0 にどんどん変わっていくけど、できるものは同じままなので実行してみたときの驚きが全然ないのがすごいw #qtdd11

2011-10-25 20:27:08
Tasuku Suzuki @task_jp

Geometry:エレメントの形を定義、三角形のメッシュ、、、 #qtdd11

2011-10-25 20:30:46
Tasuku Suzuki @task_jp

Rectanglar Geometry:矩形、Material は QSGMaterial のサブクラスでエレメントの描画内容を保持、QSGMaterialShader でマテリアルに適用するシェーダーを定義 #qtdd11

2011-10-25 20:33:02
Tasuku Suzuki @task_jp

カスタムマテリアルを使って QPainter の変わりにシェーダーで描画してみよう #qtdd11

2011-10-25 20:33:48
Tasuku Suzuki @task_jp

QSGSimpleMaterialShader クラスを派生して updateState() を再実装、vertex shader と fragmentShader (の文字列) も再実装 #qtdd11

2011-10-25 20:35:25
Tasuku Suzuki @task_jp

シェーダー言語はあまりよく分からないw どちらも10行程度。 #qtdd11

2011-10-25 20:36:43
Tasuku Suzuki @task_jp

updatePaintNode はノードが無ければ QSGGeometryNode を生成していくつかの設定をする。更新は... #qtdd11

2011-10-25 20:38:12
Tasuku Suzuki @task_jp

次は 3D のサンプル:x z のローテーションと色を QML のプロパティに持つ。 #qtdd11

2011-10-25 20:41:13
Tasuku Suzuki @task_jp

3D の場合は QSGSimpleMaterialShader の resolveUniforms() を実装 #qtdd11

2011-10-25 20:41:56
Tasuku Suzuki @task_jp

program()->setUniformValue() で様々な値を設定、この例では Vertex は QVertex3D を3つ。初期化方法は分かりにくいのでサンプルを見てね。 #qtdd11

2011-10-25 20:44:55
Tasuku Suzuki @task_jp

ジオメトリノードも派生クラスを作成、基底クラスでもできるけどコードが汚くなるので。。。 #qtdd11

2011-10-25 20:46:38
Tasuku Suzuki @task_jp

updatePaintNode() で、トランスフォームノードとジオメトリノードを変更する。最初は作る。テクスチャを画像から作りいくつかの設定をする。トランスフォーメーションノードに対して3Dの処理(Matrix)をする。 #qtdd11

2011-10-25 20:48:56
1 ・・ 4 次へ