Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Standard Material: Roughness texture does not work, it always becomes 0.0 #212

Closed
0b5vr opened this issue Mar 7, 2019 · 7 comments
Closed
Labels
Milestone

Comments

@0b5vr
Copy link
Contributor

0b5vr commented Mar 7, 2019

Related

#179
#185

Description

Unity側でSmoothnessのテクスチャが割り当てられている場合、Smoothnessのスカラ値は1.0になりますが、
この状態でglTFに出力した場合、Roughnessの値は0.0になります。

ここで、glTF側ではRoughnessスカラとRoughnessテクスチャのテクセル値とが掛け合わせられ、Roughness値が決定されますが、
このときに0.0と掛け合わせられます為、Roughnessがテクセル値にかかわらずすべての箇所において0.0となってしまうようです。

逆に、Smoothnessのスカラ値を手動で0.0にして出力した場合、正しく出力されることが確認できました。

おそらく、場合によっては、出力時にRoughnessテクスチャにスカラと掛け合わせた値を焼き込む実装が必要になると考えられます。

glTFの仕様は以下のとおりです。

https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#pbrmetallicroughnessroughnessfactor

@yutopp
Copy link
Contributor

yutopp commented Mar 11, 2019

報告ありがとうございます。調査します。

@yutopp
Copy link
Contributor

yutopp commented Mar 14, 2019

Unityのsmoothness0.0のときにrough、1.0のときにsmoothであり、一方でglTFのroughnessfactorは仕様から0.0のときsmooth、1.0のときroughになります。

smoothになるときの値 roughになるときの値
smoothness(Unity) 1.0 0.0
routhnessFactor(gltF) 0.0 1.0

なので、反転した値が書き込まれるのは意図した実装です。というのが現状の説明になります。

そのうえで、どのようなパラメータのときにこのような出力になってほしいなどの例などありましたら提供して頂けると助かります 🙏

@yutopp yutopp added this to the v0.52.0 milestone Mar 14, 2019
@0b5vr
Copy link
Contributor Author

0b5vr commented Mar 14, 2019

はい!そこまでは理解しております。
問題は、そこに対してテクスチャが当たった場合の処理でして……
言語で説明するのが下手なので、図で失礼します。

roughness

図のように、Roughnessに対してMapを当てる場合、Mapの値はスカラと乗算されますので、
0.0をMapと掛けると完全にRoughness=0.0のマテリアルができてしまいます。
Mapがある時とない時とでは、場合分けを行ったほうがいいような気がします。

おそらく、逆にglTFをUniGLTFからインポートした際も、同様の症状が発生してしまうと思います。

@0b5vr
Copy link
Contributor Author

0b5vr commented Mar 14, 2019

これがさらに、0.5などの中途半端な値が入ってきた場合、
以下のように値の変換だけではどうしようもないパターンが出てきてしまいます。

roughness2

このため、Smoothness MapをRoughness Mapに変換するタイミングでスカラ値をテクスチャに焼き込むか、
Roughnessに対応した新たなシェーダを用意する必要があります。

roughness = (1-smoothness)^2 でしたね。何も考慮せずに図を作ってしまいました……!)
流石に恥ずかしかったので図を挿し替えました。

@yutopp
Copy link
Contributor

yutopp commented Mar 14, 2019

失礼しました 🙇 詳細な説明ありがとうございます!

理解しました。既存の実装は、Unityで出力したものを再度Unityで読み込むと可逆な変換によって意図した表示になっていましたが、別の実装などでRoughnessMapとしてそのまま読み込むと意図しない表示になるということが分かりましたので、修正します。

方針としては、SmoothnessMapRoughnessMapに変換する段階でsmoothnessの値も書き込んでしまって、routhnessFactorの値は固定にしてしまおうと思います(トレードオフとしてプロパティの値は可逆ではなくなります)。

@0b5vr
Copy link
Contributor Author

0b5vr commented Mar 14, 2019

ありがとうございます!

焼き込みの時点で、ただでさえ狭い8bitにさらに値が押し込められてしまうのは、
若干表現力の点で懸念がありますが、とりあえずはその手法で対処できると思います。

@yutopp yutopp self-assigned this Mar 14, 2019
yutopp added a commit that referenced this issue Mar 14, 2019
…nd roughnessFactor as hardcoded-value 1.0 in Unity world (Resolve #212)
@yutopp
Copy link
Contributor

yutopp commented Mar 14, 2019

取り急ぎ #222 で対応してみました。抜け漏れなど普通にありそうなので、問題点など見つけましたらコメント頂けるととても助かります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants