DirectD3D9. 表示優先度

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

DirectD3D9. 表示優先度

#1

投稿記事 by ヤング » 13年前

はじめまして

DirectX9でゲームのような3Dアクション作ってます。


あるオブジェクトを他のオブジェクトと重なったときに隠れないで常に見える状態に

したいのですがどうすればいいでしょうか?

SetRenderStateを使えばいいのでしょうか?

常に表示優先度を高くして手前に表示させたいオブジェクト(Strideで判断させる)に対して命令をするのか他のオブジェクトにたいして命令するのかもわからないので教えてください。


よろしくおねがいします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectD3D9. 表示優先度

#2

投稿記事 by softya(ソフト屋) » 13年前

DirectX自体の命令に詳しくないことをお断りします。
Z値を無視すればなんとでもなるでしょうが、やりたいことは本当にそんなことなのでしょうか?
※ 壁の向こうのキャラが見る状態?って感じでしょうか。

>あるオブジェクトを他のオブジェクトと重なったときに隠れないで常に見える状態に

この詳しい状況が知りたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヤング

Re: DirectD3D9. 表示優先度

#3

投稿記事 by ヤング » 13年前

返信ありがとうございます。

アイテムを取得すると一定時間 壁が透けて エネミーが見えるということを実装したいと考えてます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectD3D9. 表示優先度

#4

投稿記事 by softya(ソフト屋) » 13年前

ヤング さんが書きました:返信ありがとうございます。

アイテムを取得すると一定時間 壁が透けて エネミーが見えるということを実装したいと考えてます
それだとZ値をただ触っただけでは壁と向こう側の敵の前後関係が分からなくなると思います。
壁を半透明化するとか、敵の周りだけ透けて見るようなエフェクトを掛けるとか必要でしょうね。
どうされる予定でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヤング

Re: DirectD3D9. 表示優先度

#5

投稿記事 by ヤング » 13年前

前後関係はわからなくなってしまいますが、壁などのオブジェクトは透過処理はせずに
エネミーだけを最前面に描画したいと考えてます。
よろしくお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: DirectD3D9. 表示優先度

#6

投稿記事 by softya(ソフト屋) » 13年前

ヤング さんが書きました:前後関係はわからなくなってしまいますが、壁などのオブジェクトは透過処理はせずに
エネミーだけを最前面に描画したいと考えてます。
よろしくお願いします
SetRenderStateでZ値のバイアスを掛ければ出来ると思います。 間違いでした。
が、見た目としては止めた方がいいって事だは言っておきますね。

【補足】
Z値バイアスは使ったことがないので勘違いかもしれません。
これでダメならZバッファを一度クリアするって方法があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヤング

Re: DirectD3D9. 表示優先度

#7

投稿記事 by ヤング » 13年前

返信ありがとうございます

コード:

		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. 表示優先度

#8

投稿記事 by softya(ソフト屋) » 13年前

これはZバッファの利用を一時的にOFFにしているだけですよね? これは問題があると思います。

1)ZバッファをOFFにするとキャラクタの描画でポリゴンに問題が出るはずです。
2)描画順で重ね合わせの順番が決まるので山などが後で描画されると上書きされます。これは単に描画順の問題です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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