3Dテクスチャの透過処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
紅葉

3Dテクスチャの透過処理

#1

投稿記事 by 紅葉 » 16年前

3Dテクスチャの透明度を描画するごとに変えたいです。
例)Aのメッシュは0xffで描画(通常)
  Bのメッシュは0x80で描画(通常の半分の透明度)

テキストは現在使っている描画命令でこれの一番上にある
DrawModelTest(・・・)の最後のrollの後ろに引数を付け足したいです。

言語はC++でコンパイラはVS2005です。

よろしくお願いします。
  

Justy

Re:3Dテクスチャの透過処理

#2

投稿記事 by Justy » 16年前


>テキストは現在使っている描画命令でこれの一番上にある
>DrawModelTest(・・・)の最後のrollの後ろに引数を付け足したいです。

 いろいろやり方がありますが、一番簡単なのは DirectXのレンダーステートを弄ることでしょう。
 ざっくりとやりかたを書くと

1 ブレンドに関するレンダーステートを変更する(変更前に現在の値を覚えておくこと)
[color=#e0f0ff" size="-1" face="monospace]
D3DRS_SRCBLEND: D3DBLEND_SRCALPHA
D3DRS_DESTBLEND: D3DBLEND_INVSRCALPHA
D3DRS_ALPHABLENDENABLE: TRUE[/color]

2 テクスチャステージ0はそのままに、テクスチャステージ1を変更する
(変更前に現在の値を覚えておくこと)
[color=#e0f0ff" size="-1" face="monospace]
例)
D3DTSS_COLOROP: D3DTOP_MODULATE
D3DTSS_COLORARG1: D3DTA_CURRENT
D3DTSS_COLORARG2: D3DTA_TFACTOR
D3DTSS_ALPHAOP: D3DTOP_SELECTARG1
D3DTSS_ALPHAARG1: D3DTA_TFACTORE[/color]

 で、D3DRS_TEXTUREFACTORに対し、掛け合わせたいカラー値を入れます。
 半分の半透明にするなら 0x80ffffffを入れて下さい。

3 描画する

4 1,2で保存したレンダーステートを元に戻す


 こんな感じです。
 ただ、やってみるとわかりますが、モデルの半透明はそのままですと
いろいろ問題があります。

 どんなモデルなのか、とかどこまで許容するかで解決方法が変わってきます。
 まぁ、それは追々ということで。

紅葉

Re:3Dテクスチャの透過処理

#3

投稿記事 by 紅葉 » 16年前

レスありがとうございます。

モデルは立方体です。
とりあえず貼れていれば構いません。

申し訳ないのですが説明の意味が全く分かりません・・・

勉強不足で申し訳ないです。

GPGA

Re:3Dテクスチャの透過処理

#4

投稿記事 by GPGA » 16年前

SetRenderStateとSetTextureStageStateで検索してみてください。

Justy

Re:3Dテクスチャの透過処理

#5

投稿記事 by Justy » 16年前


>申し訳ないのですが説明の意味が全く分かりません・・・

 紅葉さんが前回添付されたコードの中にlpD3DDev->SetRenderState(...)という
関数がありますが、これがレンダーステートを変更する関数です。

 lpD3DDev->SetTextureStageState(...)がテクスチャステージ関連の設定ですね。
 
 よく見れば同じソース内にD3DRS_SRCBLENDとかD3DRS_DESTBLENDとかの
キーワードも見つかるはずです。

 又、現在の値を取得する関数は lpD3DDev->GetRenderState(...)のように Setを Getにした関数となります。

 このあたりは解説すると長くなるので、書籍か Webかで調べてみて下さい。

紅葉

Re:3Dテクスチャの透過処理

#6

投稿記事 by 紅葉 » 16年前

>>熟練のプログラマーさん
調べてみたのですが一覧表みたいなのが出てきました><
ただ使い方がわからないです><
すいません・・・

>>ハッカーさん
いつも質問に答えて下さりありがとうございます。
このマスターは私が作ったものではないので理解できないです><

添付してあるのが現在のソースです。
どこが違うのか教えていただけないでしょうか?
できれば以前みたいに直したものを頂けますと助かります。
丸投げになって申し訳ないのですが
私はスクリプターですのでサイトなどをみても理解できません><

Justy

Re:3Dテクスチャの透過処理

#7

投稿記事 by Justy » 16年前

 ハンドルネームは、ハッカーじゃないんですけどね・・・。


>ただ使い方がわからないです><

 ひょっとして、DirectXそのものも実はあまりよく解っていない、なんてことはありませんか?
 この添付のライブラリは学校の課題か何かですか?



>私はスクリプターですのでサイトなどをみても理解できません

 スクリプターが何でプログラムを???
 というかプログラマーはどこに?????

Justy

Re:3Dテクスチャの透過処理

#8

投稿記事 by Justy » 16年前

 何となく何かの課題か卒業制作な気がしてきました。
(気のせいですかね?)


 ソースを書いて出すのは直ぐ出来ることですが、
それでは紅葉さんの為にならないと思います。


 今の状態ですと、ソースを出したところで全く理解できないものになるでしょうし、
それどころか、次にまた何かしようとしたときにすぐ壁にぶつかり、
やっぱり解らないから訊きに来る、というループが延々と繰り返されるような
気がします。

 まず、紅葉さんがしなければならないことは、以下の2つのどちらかです。
 
・ 仲間か同僚かはわかりませんが、周囲にいるプログラマーに任せる
 少なくとも、このあたりのコーディングをスクリプターがすること普通考えられないので、
ちゃんと本職に任せた方がいいでしょう。
 いないのであれば、どこかから正式にスカウトして下さい。

・ DirectXの基礎を学ぶ
 特に今回で言うならレンダーステート周りについて(すぐに諦めないで)
もっと時間を掛けて調べてみて下さい。

 たしかにこのあたりは慣れないと取っつきにくいとことではありますが、
描画をする上でとても重要な概念なので、ここはきっちり押さえて下さい。


 Ci-Lib.cppにはレンダーステートをあちこちで変更しています。
 それらが何の役割をしていて、そこでそれがないとどうなるのか、
どんなレンダーステートがあってどういう役割なのかなどをテストプログラムを
書きながら研究していけば、そのうちきっと理解できるはずです。

 いっそのこと、この Ci-Lib.cppを捨てて、一から自分で書き直した方がいいかもしれませんね。
 その方が理解が早いでしょうし。


 と、いろいろ書きましたがその上で。
(時間を掛けていろいろ調べても)どうやってもわからないとか、
(提出期限があるなら)もう時間がないとか、
どーでもいいから答えだけ欲しい
ということでしたら、改めて申して下さい。

 その時はソースを出します。

紅葉

Re:3Dテクスチャの透過処理

#9

投稿記事 by 紅葉 » 16年前

課題とかなどではなく同人でゲームを作ろうと
チームで製作しているのですがPGで雇った方が
全くプログラムができなく、素材などはほとんどできているのですが
プログラムはできていません><
これはその方から配布されたものです。

私は音を製作している人間なのでPGは簡単な流れ程度しかわからないので
スクリプターと言わせていただきました。

またDirectXなどでゲームを作ったことがほとんどないです。
どちらかと言うと金融関係のサーバプログラムなどのCUIしか触れません。

急いではいませんが一応、同人で製作していて
次の集まりが木曜なのでそれまでにいただけますと助かります。
申し訳ないのですが直したのをいただけないでしょうか?

Justy

Re:3Dテクスチャの透過処理

#10

投稿記事 by Justy » 16年前

 なるほど。状況は理解しました。


>PGで雇った方が 全くプログラムができなく

 これは・・・大変ですね(^^


>申し訳ないのですが直したのをいただけないでしょうか

 添付しておきました。
 描画関数は DrawMyMeshColor()となります。
 
 サンプルとして、Gs_DrawModelMat()で対応してありますが、
すぐに他の関数にも応用できると思います。

 具体的に言えば、

[color=#e0f0ff" size="-1" face="monospace]
lpD3DDev->SetTransform(D3DTS_WORLD,&mat);
DrawMyMesh(pMyMesh);
[/color]
 な部分を DrawMyMeshColor()の呼び出しに変えれば、OKです。

 カラー値の指定は GsCOLOR型にしてあり、半透明であれば
ARGB(0x80, 0xf, 0xff, 0xff)でいけると思います。

 又、カラー値によって処理を分けていますので、ARGB(0xff, 0xff, 0xff, 0xff)の場合は
従来通りの描画を行いますので、 DrawModelAxis()などの中で呼ばれている DrawMyMesh()の呼び出しを DrawMyMeshColor()に変えてしまってもいいかと思います。

紅葉

Re:3Dテクスチャの透過処理

#11

投稿記事 by 紅葉 » 16年前

お忙しいのにわざわざ新しい関数を作っていただきありがとうございました。

ただ描画してみると変?になるのですが D3DXMATRIX がおかしいのでしょうか?

D3DXMATRIX* D3DXMatrixTranslation(
D3DXMATRIX* pOut ,
FLOAT x , FLOAT y , FLOAT z
);

など色々 D3DXMATRIX での書き方があったのですが初期化の仕方が理解できないです。
質問ばかりで申し訳ないです。 と言いますか、わざわざありがとうございます><

Justy

Re:3Dテクスチャの透過処理

#12

投稿記事 by Justy » 16年前

[color=#e0f0ff" size="-1" face="monospace]
D3DXMATRIX a;
Gs_DrawModelMat(M_BOX,a,ARGB(0xff,0xff,0xff,0xff));
[/color]
 このように宣言しただけでは D3DXMATRIX型は不定な値になっているので、
[color=#e0f0ff" size="-1" face="monospace]
D3DXMATRIX a;
D3DXMatrixIdentity(&a);
Gs_DrawModelMat(M_BOX,a,ARGB(0xff,0xff,0xff,0xff));
[/color]
 として、aを初期化して下さい。

 というか、前回の回転のプログラムに当てはめれば、
直ぐにできると思います。

紅葉

Re:3Dテクスチャの透過処理

#13

投稿記事 by 紅葉 » 16年前

できました。

D3DXMatrixIdentityにアドレスを送れば初期化できるのは初めて知りましたw
本当にありがとうございます><

紅葉

Re:3Dテクスチャの透過処理

#14

投稿記事 by 紅葉 » 16年前

すいません。解決マーク忘れていました。

Justy

Re:3Dテクスチャの透過処理

#15

投稿記事 by Justy » 16年前

 解決して何よりです。

 老婆心ながら、今の製作体制では早晩行き詰まる可能性が高いと思われるので、
早めに改善したほうがいいかと思います。


 あ、そうだ。
 DrawMyMeshColor()ですが、他の描画関数に適用していくなら、
[color=#e0f0ff" size="-1" face="monospace]
void DrawMyMeshColor(MESH *pMyMesh, const MAT &m, GsCOLOR color)
{
lpD3DDev->SetTransform(D3DTS_WORLD, &m);

StateSaver::RenderState rs;
StateSaver::TextureStage ts;

if(color != ARGB(0xff, 0xff, 0xff, 0xff))
{
RenderStateSetter rsSetter(rs);
TextureStageSetter tsSetter(ts);

rs.SetState(D3DRS_TEXTUREFACTOR, static_cast<DWORD>(color));
array_for_each(ts_tbl, tsSetter);
if(color >> 24 != 0xff)
{
array_for_each(rs_tbl1, rsSetter);
DrawMyMesh(pMyMesh);
array_for_each(rs_tbl2, rsSetter);
}
}
DrawMyMesh(pMyMesh);
}
[/color]
の方がいいですね。

 これなら、DrawModelAxis()とかに適用しやすいでしょうし。

紅葉

Re:3Dテクスチャの透過処理

#16

投稿記事 by 紅葉 » 16年前

わざわざありがとうございました><

プログラムは私の方でも勉強してみようかと考えています。

閉鎖

“C言語何でも質問掲示板” へ戻る