HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0427
buhioポリゴンの透過処理について7解決


buhio

リンク

2024/4/27(Sat) 17:42:38|NO.101634

 どもども。みなさんこんにちわ。

3D描画において、添付の画像です。
https://drive.google.com/file/d/1KbZF7BFJ9cLRgXy1tusxLcjEBGuxR_OL/view?usp=sharing

これは、ポリゴンを上から見て「*」という風に3枚重ねて、草のpngを表示しています。
背面カリングはOFFにし、どこから見ても草っぽく見えたらいいなあというやつです。
(関係ないと思いますが、法線ベクトルは、全ポリゴンに(0,1,0)のY_UPを指定しています)

画像を見ると、左側の草はキレイに透過がかかっていますが、右側へ行くと草の周りがギザって切り抜きが見えてしまっています。

これはどういう現象で、回避可能でしょうか?

なお、シェーダーは標準のもので、改変しておりません。
よろしくお願いいたします。



この記事に返信する


buhio

リンク

2024/4/27(Sat) 20:01:40|NO.101635

https://drive.google.com/file/d/102rCgF9PzEqdv1j5zY-mEbr8r4r-dV0g/view?usp=sharing

うーむ、ある方向から見るときれいなんで、

Zソートの問題なんでしょうか、カメラから見て奥から順に描画するのがZソートという認識ですが、
違うんでしょうか?

頂点自体はきちんとZソートされているようにも見えます。
アルファ値がある場合にこうなるのでしょうか?

うーん、うまくいった〜と思ったのになぁ。。。



usagi

リンク

2024/4/27(Sat) 20:28:04|NO.101636

こんにちわ
Zバァッファ法とZソート法というものがありHSPでは前者が採用されてます。
アルファが0.5などの場合、その部分もデパスバッファに書き込まれますから
後から奥の物が描画されるとデプステストに失敗するため背景と0.5で合成された色が残ってしまうわけです。
1番簡単な対応はアルファを1か0のどちらかにしてしまうか、
奥から描画されるようにコントロールする必要があります。



buhio

リンク

2024/4/27(Sat) 21:58:31|NO.101637

>>usagi師匠

 またお世話になってしまいました。ありがとうございます。
 頂いたアドバイスから、私が考え付くのは、
 1.アルファ値が0か1の画像を用意する方法(ちょっと後回し)
 2.シェーダーでceil関数でアルファ値を0か1に強制変換
 3.元の画像の問題なのか黒い淵が出たので、シェーダーのdiscardを大きくした
https://drive.google.com/file/d/15TBQHqpUqWWFecYMviHy9oFn1kVz3AVR/view?usp=sharing

 という形で、自分的には結構いい感じになったかなと思っております。

 また質問で恐縮ですが、
 ● discardというのは、ピクセルを破棄するって命令ですよね?
 ● ご回答の「奥から描画されるようにコントロールする」というのは、HSPでどのような操作になるのでしょうか

 いつも勉強になります!!!!



GENKI

リンク

2024/4/27(Sat) 22:51:53|NO.101638

> 「奥から描画されるようにコントロールする」というのは
文字通り、カメラから遠い順にオブジェクトを配置する。
カメラから遠いほどオブジェクトIDの数値が小さくなるようにするということです。

こちらも参考にどうぞ。
https://mclab.uunyan.com/lab/hgimg4/hgimg4_028.htm#%E5%8D%8A%E9%80%8F%E6%98%8E%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%8F%8F%E7%94%BB



usagi

リンク

2024/4/28(Sun) 00:28:00|NO.101639

>discardというのは、ピクセルを破棄するって命令ですよね?
はい、その通りです。
仰られる通りceil関数でアルファ値を0か1に強制変換してしまうと、縁が出てしまうので、
if (gl_FragColor.a < 1) discard; としておけば1の部分だけ描画されると思います。
その時点で処理が破棄されるため処理負荷的にも非常に有利です。

>ご回答の「奥から描画されるようにコントロールする
GENKIさんの回答と、おまとめされているページの通りですね。
個別のソート(むかしあったOBJ_SORT)は今は無いので、表現したい方法に合わせて組む必要がありますが、
おそらくカメラを360度回せる3Dゲームの様なものを想定していると思いますので、
テクスチャを抜くのであれば"*"の形に配置するビュジュアル表現を考えても
αをdiscardするのがコスパ的にも良いかと思います。

なお、Zソートに対応したとしても優秀ではないので、デザイナー側で工夫は必要になります。

古い記事ですが、まとまってるもの見つけました。
https://www.klab.com/jp/blog/creative/2019/22266460.html

MONSTER HUNTERなんかはディザ合成でうまく見せてますよね。
https://jp.ign.com/monster-hunter-world/17385/news/cedec-2017
https://dengekionline.com/elem/000/001/586/1586569/



buhio

リンク

2024/4/28(Sun) 10:40:55|NO.101640

>>GENKIさん

 記事を拝読しました。設定の意味が詳しく理解できました(半分くらい、、)

>>usagi師匠

 お二方の説明通り頂点番号順の描画と考えると、辻褄が合います。

 今回は、大量の草を生やすのが最終目的のため、一つの草オブジェクトを配置するのではなく、
メッシュをスクリプトで作成し、一つのオブジェクトとして配置しています。
 テストでオブジェクト単位で大量に配置したところ、500個(6万ポリゴン。うる覚えですが。)くらいでFPSに影響してしまいました。
 一つのオブジェクトに草500個分だと、まだまだいける感じです。

 という条件下ですと、1つのオブジェクト内での描画順が重要ということになります。
 例えば背面カリングにするのではなく、*の表側メッシュを奥から配置し、裏側メッシュを逆順に作成して
配置していくことで、完全ではないにしても逆から見ても目立たなくできるのでは、、と考えましたが、まだテストできていません。



buhio

リンク

2024/4/28(Sun) 11:47:33|NO.101641

https://drive.google.com/file/d/10sE58OiSQBmNInn3HO0bkPpbb4-5Tt1A/view?usp=sharing

アルファ値 0か1で、10000個置いてみました。

ちょっと草原って感じが出ました。。( *´艸`)うれしい。。

一旦解決にさせていただきますが、、ご意見アドバイスは是非是非くださいませ。。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101634への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.