実現したいこと
UnityでテクスチャのAlphaが0より大きい場合に発光させたい
前提
お絵かきアプリのようなものを作っています。
Canvas上の背景画像の全面に、透明なテクスチャ画像を作成して、
そのテクスチャに直接絵を描けるところまでは行きました。
発生している問題・エラーメッセージ
ChatGPTの指示通りにシェーダーを作成し、
絵を書くテクスチャに、シェーダーが適応されたマテリアルをアタッチしても、線が全く発光しません。
以下が、シェーダーのコードです。
やりたいこと
CanvasLineDrawer.cs(Canvas上のRawImageにアタッチされている絵を描くスクリプト)のStart関数内で、
Canvas上に配置されたRawImageと同じサイズのAlpha0のテクスチャ画像を作り、
その透明なテクスチャ画像の上に_texture.SetPixel()関数で線を描いています。
今回は線自体を発光させたいので、そのテクスチャに下記のシェーダーが適応されたマテリアルを設定し、
アルファの値が0より大きければ発光するというようにしたいです。
該当のソースコード
Shader "Custom/GlowLine" {
Properties{
_MainTex("Texture", 2D) = "white" {}
_EmissionColor("Emission Color", Color) = (1, 1, 1)
_LineWidth("Line Width", Range(0.0, 1.0)) = 0.1
}
SubShader{
Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _LineWidth; float4 _EmissionColor; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : SV_Target { float4 col = tex2D(_MainTex, i.uv); // 線の発光を表現するためにエミッションの強度を調整する col.rgb *= _EmissionColor.rgb * _EmissionColor.a * 3.0; // 線の太さを表現するために、アルファ値を変更する col.a *= smoothstep(0.5 - _LineWidth / 2.0, 0.5 + _LineWidth / 2.0, col.a); return col; } ENDCG } } FallBack "Diffuse"
}
ソースコード
試したこと
ChatGPTの指示通りにシェーダーを作成し、
絵を書くテクスチャに、シェーダーが適応されたマテリアルをアタッチして実行した。
補足情報(FW/ツールのバージョンなど)
なるべく軽い処理が好ましいので、もっとシンプルで軽い実装の仕方があれば教えてください。
最終的に、描いた絵がテクスチャとして保存できればなんでも構いません。
あなたの回答
tips
プレビュー