半透明のテクスチャがうまく表示されない

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

半透明のテクスチャがうまく表示されない

#1

投稿記事 by 珈琲 » 12年前

半透明テクスチャの海の上だと煙などの透明テクスチャを用いたモデルが、海の反射光を無効化してしまいます。
海の材質の反射光を0にすれば繰り抜かれたようには鳴らないと思うのですが、光の反射は消したくありません、どうしたらいいでしょうか?
画像


それと、Zソート自体が機能しないという別件の場合があります。
自機から他の機体の方向に向かって一定距離の位置にカーソル(赤や緑の四角形)をHUDとして表示しているのですが、
そのカーソルの前後関係が高頻度で逆転してしまいます。(Zソートできていない状態?)

↓ちょっとカクカクで見づらいですが、稀に奥の赤いカーソルが切り取られてるのがわかると思います
画像

Zソートのコードは今まで以下の物で正常に動作していましたし、このカーソルだけ特別なことはしていません。

コード:

//Zソート用のプレディケート
bool CDrawObject::ZSortAlgorithm(CDrawObject* Left,CDrawObject* Right){
	/*
	VECTOR LV = Left->GetPosition();//3D座標
	VECTOR RV = Right->GetPosition();//3D座標

	MATRIX CameraMatrix = CCamera::GetInstance()->GetCameraMatrix();//カメラの行列

	return VTransform(LV,CameraMatrix).z > VTransform(RV,CameraMatrix).z; 
	*/
	//上のコードを1行にまとめたもの(一時変数の排除)
	return VTransform(Left->GetPosition(),CCamera::GetInstance()->GetCameraMatrix()).z > VTransform(Right->GetPosition(),CCamera::GetInstance()->GetCameraMatrix()).z; 
}

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 半透明のテクスチャがうまく表示されない

#2

投稿記事 by ISLe » 12年前

Zソートのコードが1パターンということは、Zバッファが有効な状態で半透明のものとそうでないものをまとめてソートしているということでしょうか。

Zバッファが有効な場合、半透明でないものを手前から奥に向かって描画すると効率が良いわけですが、半透明のものは奥から手前に向かって描画しないと奥が描画されないので透けません。
また、半透明でないものをすべて描画してから、半透明のものを描画する必要があります。

描画するもの全体が半透明のときはZバッファの書き込みだけ止めるという手もあります。

HUDの情報をワールド空間に配置しているというのはおかしな感じがしますが、そういうものなんでしょうかね。

珈琲

Re: 半透明のテクスチャがうまく表示されない

#3

投稿記事 by 珈琲 » 12年前

半透明のオブジェクトと半透明でないオブジェクトは分けてZバッファに登録しています

コード:

//不透明
	for(size_t i=0;i<OpacityFrameList.size();i++){
		OpacityFrameList[i]->Draw();
	}

	sort(TranceFrameList.begin(),TranceFrameList.end(),CDrawObject::ZSortAlgorithm);
//半透明
	for(size_t i=0;i<TranceFrameList.size();i++){
		TranceFrameList[i]->Draw();
	}
こんな感じです

[hr]

ただ、Zソートはメッシュ単位ではなくフレーム単位にソートしています。
(不透明のZソートはしていません)

>描画するもの全体が半透明のときはZバッファの書き込みだけ止めるという手もあります。
うーん?

コード:

	SetWriteZBuffer3D(false);
	for(size_t i=0;i<TranceFrameList.size();i++){
		TranceFrameList[i]->Draw();
	}
	SetWriteZBuffer3D(true);
こんな感じで挟み込んで見たんですが、できず
そういうことではない・・?

コード:

void CModelFrame::Draw(){
	MV1DrawFrame(ModelHandle,FrameNum);
}
Zソートのためフレーム単位で描画してます

[hr]

>HUDの情報をワールド空間に配置しているというのはおかしな感じがしますが、そういうものなんでしょうかね。
敵からの攻撃の警告が3次元的にわかりやすく見えるかな―とか、敵の方角が直感的でわかりやすいかなーとか思ってやってみたんですけどそうでもないでしょうか?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 半透明のテクスチャがうまく表示されない

#4

投稿記事 by ISLe » 12年前

質問文には海も半透明テクスチャだと書いてありますね。
海全体がひとつのメッシュだとしたら優先順位が問題になりそうですが。


HUDに正方形の枠を表示するなら常に正方形であるほうが良いのではないでしょうか。
敵の位置が自機と同じ奥行きのときは直線になってしまう(あるいは表示されない)のでは。

珈琲

Re: 半透明のテクスチャがうまく表示されない

#5

投稿記事 by 珈琲 » 12年前

海はタイル状になっていて、現在の座標を中心から一定距離まで描画するようにしています。
が、これはやっぱりやめたほうがいいですね・・・
フレームごとではなくメッシュごとにZソートするようにしたほうがいいのでしょうか?


今試しに海のモデルファイルの環境光と反射光のパラメータを全て0にして数回試してみました。
画像
そうすると期待通りに描画されました

反射光の成分が、透明テクスチャを通して描画できていないのかと考えていますが、
どうやって修復すればいいかわかりません・・・





>HUDに正方形の枠を表示するなら常に正方形であるほうが良いのではないでしょうか。
>敵の位置が自機と同じ奥行きのときは直線になってしまう(あるいは表示されない)のでは。
確かに見難くなり、完全に消えるときもありますが、その前後で表示されているので、気になるほどではないのでは、と考えています。
(でも、実際にやってみてフィードバックで不評だったらやめると思います。)

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 半透明のテクスチャがうまく表示されない

#6

投稿記事 by ISLe » 12年前

実物を見ないことにはどこに問題があるか分からないですね。

単純にモデルを限定し配置して描画するだけのシンプルなコードで再現できないのでしょうか。

閉鎖

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