忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

かんたんXNA HLSL編 その2 構造体

このページは古いです
最新版はこちら

前回表示したポリゴンに色はついていませんでした。
使った頂点データには色がついていたにもかかわらず、
実際に描画された三角形のすべてのピクセルの色が白だったのです。

これは前回のエフェクトファイルが色を扱っていないことが原因です。
頂点シェーダでは、位置情報だけではなく色の情報も扱わなければなりませんし、
ピクセルシェーダだって引数として色をとらなければなりません。

位置だけでなく色の情報も扱うためには、その二つをまとめるための
構造体を作る必要があります。
(複数の戻り値を返すことはできませんからね)

拍手[0回]

PR

かんたんXNA HLSL編 その1 エフェクトファイル

このページは古いです
最新版はこちら

いよいよHLSLに入ることにします。
でも正直なところあんまり自信はなくって
勉強しながら書いている状態なのですが・・・。

HLSLとは?

High Level Shader Language (HLSL)とは頂点データを
どのように処理して描画するかを表現するためのとくべつな言語です。
この言語で書いたテキストファイルをコンパイルして、
C#でEffectクラスからコントロールするのです。
(BasicEffectのかわりです。というか、BasicEffect自体Effectから派生しています)

MSDNの記事には、これは上位レベルの言語で、
さらにC言語スタイルがベースになっててプログラマにとってなじみやすい
というような趣旨のことが書いてありますが、
しょうじきなところ真実はまったくの逆であるような気がします。
C言語ライクなのはたしかですが、C#やjavaになれているプログラマからすれば
かなり低レベルでしかもとっつきにくいように思えます。
(まぁでもHLSL以前では、アセンブリ言語をつかわなくてはならなかったため、
これでもまだマシになったほうらしいのです。)


ではなぜそんな言語を使わなければならないのでしょうか?
それはこの言語を使うと、C#だけを使うときより、
描画のやりかたをより細かくコントロールできるからです。
C#でBasicEffectを使うときよりより高度な描画ができるのです。
(そう、HLSLでやるのはBasicEffectとおなじです。
ただし、もう少し、細かい設定ができるのです。)

拍手[0回]


かんたんXNA その30 カスタム頂点

このページは古いです
最新版はこちら

さて、ここまで、頂点データに使う構造体は
あらかじめXNAに用意されたものを使っていました。

XNAに初めから用意されている頂点の構造体には
以下の4つがあります。
それぞれの名前はそのメンバを反映しています。
(いずれもMicrosoft.Xna.Framework.Graphics名前空間にあります)

名前 座標 テクスチャ座標 法線
VertexPositionColor × ×
VertexPositionColorTexture ×
VertexPositionNormalTexture ×
VertexPositionTexture × ×

しかし、ManagedDirectXでは14個用意されていたことを考えると、
「以下の4つがあります」というより
「以下の4つしかありません」という方が適切でしょう。
だいたいVertexPositionNormalColorが無いってどういうことですか!
初学者を殺す気ですか!?

しかしながら用意されていないからといって泣き寝入りする必要はありません。
頂点の構造体は自分で新たに作ることが出来るからです。
VertexPositionNormalColorはもちろん、
さまざまなタイプの頂点を作ることが出来るのです。

拍手[0回]


かんたんXNA その29 テクスチャへの描画 RenderTarget

このページは古いです
最新版はこちら

今まではウィンドウの画面にだけポリゴンを描画していましたが、
XNAでは実はテクスチャに対して描画することも出来ます。

これによりテクスチャを動的に作り出すことができ、
例えばゲームの中のアイテムとしてパソコンを作って、その画面を動かしたり出来るでしょう。
テクスチャに対していろいろ描画して、
それをゲームの中のパソコン画面に貼り付ければいいのです。


拍手[0回]


かんたんXNA その28 ビューポートで分割スクリーン

このページは古いです
最新版はこちら

今回はゲーム画面を2つに分割する方法です。

2人のプレイヤーでゲーム対戦する場合を考えましょう。
その場合、2Dならともかく、3Dなら
プレイヤーによって画面が2つに分かれているべきでしょう。
画面が左と右の二つに分かれていて、
プレイヤーはそれぞれ自分の画面を見て相手を倒すのです!

そういったことをする場合、ゲームのモデルを全て
それぞれの画面に1回ずつ、計2回描画することになります。

その際、単に描画したのでは二人の画面が重なってしまいます。
別々の場所にモデルを描画しなければなりません。

そのように、別々の場所に描画するのに使うのが、ビューポートです。
これを使うと、描画する領域の位置や大きさを変更することが出来ます。




拍手[1回]