はじめまして
DirectX9でゲームのような3Dアクション作ってます。
あるオブジェクトを他のオブジェクトと重なったときに隠れないで常に見える状態に
したいのですがどうすればいいでしょうか?
SetRenderStateを使えばいいのでしょうか?
常に表示優先度を高くして手前に表示させたいオブジェクト(Strideで判断させる)に対して命令をするのか他のオブジェクトにたいして命令するのかもわからないので教えてください。
よろしくおねがいします
DirectD3D9. 表示優先度
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DirectD3D9. 表示優先度
DirectX自体の命令に詳しくないことをお断りします。
Z値を無視すればなんとでもなるでしょうが、やりたいことは本当にそんなことなのでしょうか?
※ 壁の向こうのキャラが見る状態?って感じでしょうか。
>あるオブジェクトを他のオブジェクトと重なったときに隠れないで常に見える状態に
この詳しい状況が知りたいです。
Z値を無視すればなんとでもなるでしょうが、やりたいことは本当にそんなことなのでしょうか?
※ 壁の向こうのキャラが見る状態?って感じでしょうか。
>あるオブジェクトを他のオブジェクトと重なったときに隠れないで常に見える状態に
この詳しい状況が知りたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DirectD3D9. 表示優先度
それだとZ値をただ触っただけでは壁と向こう側の敵の前後関係が分からなくなると思います。ヤング さんが書きました:返信ありがとうございます。
アイテムを取得すると一定時間 壁が透けて エネミーが見えるということを実装したいと考えてます
壁を半透明化するとか、敵の周りだけ透けて見るようなエフェクトを掛けるとか必要でしょうね。
どうされる予定でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヤング
Re: DirectD3D9. 表示優先度
前後関係はわからなくなってしまいますが、壁などのオブジェクトは透過処理はせずに
エネミーだけを最前面に描画したいと考えてます。
よろしくお願いします
エネミーだけを最前面に描画したいと考えてます。
よろしくお願いします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DirectD3D9. 表示優先度
SetRenderStateでZ値のバイアスを掛ければ出来ると思います。 間違いでした。ヤング さんが書きました:前後関係はわからなくなってしまいますが、壁などのオブジェクトは透過処理はせずに
エネミーだけを最前面に描画したいと考えてます。
よろしくお願いします
が、見た目としては止めた方がいいって事だは言っておきますね。
【補足】
Z値バイアスは使ったことがないので勘違いかもしれません。
これでダメならZバッファを一度クリアするって方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ヤング
Re: DirectD3D9. 表示優先度
返信ありがとうございます
このような感じで自分のやりたいことは実装できている形となりました。
この命令を実行しますと、オブジェクトなどを無視して背面(後方)に隠れている相手キャラが手前に表示されます
しかし 問題が新たに発生してしまい、ある一定のオブジェクトでしか手前に表示されません。
でかい岩と山があるのですが、岩の背面に相手キャラがいる場合は手前に表示されますが、山の場合ですとキャラクターが背面に隠れてしまっている状態のままです。
アドバイスなどなんでもよろしいので返信お待ちしております。
if(Stride == 30){//Strideの値が相手キャラクターのストライドと一致したら以下の処理を行う
dDevice->SetRenderState(D3DRS_FOGENABLE,0);
dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_NEVER);
dDrawIndexedPrimitive(dDevice, Type, BaseVertexIndex,MinVertexIndex, NumVertices, startIndex, primCount);
dDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);
}
この命令を実行しますと、オブジェクトなどを無視して背面(後方)に隠れている相手キャラが手前に表示されます
しかし 問題が新たに発生してしまい、ある一定のオブジェクトでしか手前に表示されません。
でかい岩と山があるのですが、岩の背面に相手キャラがいる場合は手前に表示されますが、山の場合ですとキャラクターが背面に隠れてしまっている状態のままです。
アドバイスなどなんでもよろしいので返信お待ちしております。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DirectD3D9. 表示優先度
これはZバッファの利用を一時的にOFFにしているだけですよね? これは問題があると思います。
1)ZバッファをOFFにするとキャラクタの描画でポリゴンに問題が出るはずです。
2)描画順で重ね合わせの順番が決まるので山などが後で描画されると上書きされます。これは単に描画順の問題です。
1)ZバッファをOFFにするとキャラクタの描画でポリゴンに問題が出るはずです。
2)描画順で重ね合わせの順番が決まるので山などが後で描画されると上書きされます。これは単に描画順の問題です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。