UnityのTextMeshProでテキストを表示しているのですが、
FontSettings内のカラーを変更した時、テキストに割り当てている画像を
白色(255,255,255)の時は完全な白
灰色(128,128,128)の時は原色
黒色(0,0,0)の時は黒
になるようにしたいのですが、付属の「TMP_SDF」シェーダーの何処を弄ればいいのかわかりません。
わかる方がいればご回答お願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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);
書き換え案として、基本色の暗い領域はテクスチャ色に乗算合成、基本色の明るい領域はテクスチャ色にスクリーン合成するというのはいかがでしょう?
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総合スコア10816
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/19 04:32
2017/12/19 10:52