質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2880閲覧

Unity マテリアルのEmission intensityについて

TomoyukiYoshida

総合スコア1

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2020/09/14 13:42

Unity 2019.4.0f1を使っています。
イメージ説明
画像の部分のintensityにスクリプトよりアクセスしたいのですが、
色々調べた結果、以下のコードにたどり着きました。
しかし思った様な結果になりませんでした。
Intensityに直接アクセスする事は出来ないのでしょうか?

public float intensity = 10f;

void Start()
{
mat = GetComponent<LineRenderer>().material;
mat.EnableKeyword("_EMISSION");
float factor = Mathf.Pow(2, intensity);
mat.SetColor("_EmissionColor", new Color(0.0f* factor, 0.0f* factor, 1.0f* factor));
}

9nahito👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ご提示のコードは「指定したIntensityの色をEmissionに設定する」という方向のようですが、そうではなくて逆に「現在のEmissionの色からIntensityを取り出したい」ということでしょうか?
でしたらColor構造体自体にはIntensityに相当する値は記録されていませんので、計算により求める必要があるかと思います。

UnityのカラーピッカーではColorMutatorがIntensity抽出(それ以外にも各種色変換処理)を担当しているようです。残念ながらこのクラスはinternalで、なおかつUnityEditorにあるためビルドしたプログラム上での実行時に使用することはできないでしょう。ですので同等の動作をするコードを自前で書く必要があるかと思います。

試しに下記のようにDecomposeHdrColorメソッドを丸写しして動かしてみたところ、インスペクター上のIntensityと同じ値が得られているようでした。UnityCsReferenceのコードは参考情報として公開されているだけであり、このように丸ごと拝借するのはライセンス的に問題があるかもしれませんが、あくまでも実験ということでご容赦ください...

C#

1using System; 2using UnityEngine; 3using Random = UnityEngine.Random; 4 5[RequireComponent(typeof(Renderer))] 6public class ColorDecomposer : MonoBehaviour 7{ 8 // specifies the max byte value to use when decomposing a float color into bytes with exposure 9 // this is the value used by Photoshop 10 private const byte k_MaxByteForOverexposedColor = 191; 11 12 private static void DecomposeHdrColor(Color linearColorHdr, out Color32 baseLinearColor, out float exposure) 13 { 14 baseLinearColor = linearColorHdr; 15 var maxColorComponent = linearColorHdr.maxColorComponent; 16 // replicate Photoshops's decomposition behaviour 17 if (maxColorComponent == 0f || maxColorComponent <= 1f && maxColorComponent >= 1 / 255f) 18 { 19 exposure = 0f; 20 21 baseLinearColor.r = (byte)Mathf.RoundToInt(linearColorHdr.r * 255f); 22 baseLinearColor.g = (byte)Mathf.RoundToInt(linearColorHdr.g * 255f); 23 baseLinearColor.b = (byte)Mathf.RoundToInt(linearColorHdr.b * 255f); 24 } 25 else 26 { 27 // calibrate exposure to the max float color component 28 var scaleFactor = k_MaxByteForOverexposedColor / maxColorComponent; 29 exposure = Mathf.Log(255f / scaleFactor) / Mathf.Log(2f); 30 31 // maintain maximal integrity of byte values to prevent off-by-one errors when scaling up a color one component at a time 32 baseLinearColor.r = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.r)); 33 baseLinearColor.g = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.g)); 34 baseLinearColor.b = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.b)); 35 } 36 } 37 38 private void Start() 39 { 40 // 実験用にランダムな色を作り... 41 var randomColor = new Color(Random.Range(0.0f, 10.0f), Random.Range(0.0f, 10.0f), Random.Range(0.0f, 10.0f)); 42 43 // とりあえず確認のため、その色をコンソールに出力してみる 44 Debug.Log($"Random color:{randomColor.ToString("F8")}"); 45 46 // その色をベース色と強度に分解し、結果をコンソールに出力してみる 47 DecomposeHdrColor(randomColor, out var baseColor, out var intensity); 48 Debug.Log($"Base:{baseColor} Intensity:{intensity}"); 49 50 // このランダム色をマテリアルにセットしてやると、インスペクター上のEmission欄の色もその色に置き換わるはず 51 // その状態でEmission欄からカラーピッカーを開くと、うまくいっていればコンソールに表示されたIntensityと 52 // カラーピッカー上のIntensityが一致しているはず 53 var material = this.GetComponent<Renderer>().material; 54 material.SetColor("_EmissionColor", randomColor); 55 56 // ちなみに、現在マテリアルにセットされている色を取得したい場合は 57 // SetColorと対になるGetColorを使えばOK 58 var emissionColor = material.GetColor("_EmissionColor"); 59 Debug.Log($"Emission color:{emissionColor.ToString("F8")}"); 60 } 61}

投稿2020/09/17 10:51

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問