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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

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

Q&A

解決済

1回答

1449閲覧

UnityのTextMeshProで文字を白くしたい

regulus123

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Unity

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

0グッド

0クリップ

投稿2017/12/17 13:29

編集2017/12/18 16:54

UnityのTextMeshProでテキストを表示しているのですが、
FontSettings内のカラーを変更した時、テキストに割り当てている画像を
白色(255,255,255)の時は完全な白
灰色(128,128,128)の時は原色
黒色(0,0,0)の時は黒
になるようにしたいのですが、付属の「TMP_SDF」シェーダーの何処を弄ればいいのかわかりません。

わかる方がいればご回答お願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

流し読みした感じでは、下記部分でFaceのColor(以下「基本色」)とFaceのTexture(以下「テクスチャ色」)を合成しているみたいですね。

HLSL

1 float scale = input.param.y; 2 float bias = input.param.z; 3 float weight = input.param.w; 4 float sd = (bias - c) * scale; 5 6 float outline = (_OutlineWidth * _ScaleRatioA) * scale; 7 float softness = (_OutlineSoftness * _ScaleRatioA) * scale; 8 9 half4 faceColor = _FaceColor; 10 half4 outlineColor = _OutlineColor; 11 12 faceColor.rgb *= input.color.rgb; 13 14 faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); 15 outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); 16 17 faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);

書き換え案として、基本色の暗い領域はテクスチャ色に乗算合成、基本色の明るい領域はテクスチャ色にスクリーン合成するというのはいかがでしょう?

参考:Adobe Photoshop での描画モード

HLSL

1 float scale = input.param.y; 2 float bias = input.param.z; 3 float weight = input.param.w; 4 float sd = (bias - c) * scale; 5 6 float outline = (_OutlineWidth * _ScaleRatioA) * scale; 7 float softness = (_OutlineSoftness * _ScaleRatioA) * scale; 8 9 half4 faceColor = half4(input.color.rgb, 1.0); // まず最初はfaceColorを頂点色で初期化しておく 10 half3 screenColor = saturate((_FaceColor.rgb - 0.5) * 2.0); // 基本色の灰~白を黒~白として抽出し、スクリーン色とする 11 half3 multiplyColor = saturate(_FaceColor.rgb * 2.0); // 基本色の黒~灰を黒~白として抽出し、乗算色とする 12 half4 outlineColor = _OutlineColor; 13 half4 texColor = tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y); // テクスチャ色を取得 14 half3 modifiedTexColor = texColor.rgb * multiplyColor; // まずテクスチャ色と乗算色を乗算合成する 15 16 modifiedTexColor = modifiedTexColor + screenColor - modifiedTexColor * screenColor; // さらに合成後の色とスクリーン色をスクリーン合成する 17 faceColor *= half4(modifiedTexColor, texColor.a * _FaceColor.a); // faceColorに乗算&スクリーン合成結果を乗算する(アルファはとりあえず基本色とテクスチャ色の積にしました) 18 outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); 19 20 faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);

[追記]
FaceのColorは通常の動作と同様にFaceのTextureと乗算し、これとFONT SETTINGSのColor (Vertex)を乗算&スクリーン合成したパターンを追記します(コード的には大して違いはないですが...)。こちらの方が四隅に別々の色を設定してグラデーションにした場合にも対応できて便利そうですね。

HLSL

1 float scale = input.param.y; 2 float bias = input.param.z; 3 float weight = input.param.w; 4 float sd = (bias - c) * scale; 5 6 float outline = (_OutlineWidth * _ScaleRatioA) * scale; 7 float softness = (_OutlineSoftness * _ScaleRatioA) * scale; 8 9 half4 outlineColor = _OutlineColor; 10 half4 texColor = tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y) * _FaceColor; // texColorは基本色とテクスチャ色の積とする 11 12 // 頂点色とtexColorを乗算&スクリーン合成 13 half3 screenColor = saturate((input.color.rgb - 0.5) * 2.0); 14 half3 multiplyColor = saturate(input.color.rgb * 2.0); 15 half3 modifiedTexColor = texColor.rgb * multiplyColor; 16 17 modifiedTexColor = modifiedTexColor + screenColor - modifiedTexColor * screenColor; 18 19 half4 faceColor = half4(modifiedTexColor, texColor.a); // 合成結果をfaceColorとする 20 21 outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y); 22 23 faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);

インスペクタの設定
プレビュー

投稿2017/12/19 03:43

編集2017/12/19 10:32
Bongo

総合スコア10807

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

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

Bongo

2017/12/19 04:32

あっ、すみません...ご所望は「FONT SETTINGS」の方の色との合成でしたかね?多分、そちらの色はinput.colorに入っていると思うので、それとテクスチャ色を合成すればいいかと思います。 すみませんが今はUnityが手元にないので、こちらのパターンは後ほど試してみます。
regulus123

2017/12/19 10:52

提案していただいた物を拝見させていただいたところ、無事実現したかった事が出来ました。 大変助かります。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問