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

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

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

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

Q&A

0回答

371閲覧

UnityでテクスチャのAlphaが0より大きい場合に発光させたい

bobury

総合スコア0

Unity

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

0グッド

0クリップ

投稿2023/04/21 04:56

実現したいこと

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/ツールのバージョンなど)

なるべく軽い処理が好ましいので、もっとシンプルで軽い実装の仕方があれば教えてください。
最終的に、描いた絵がテクスチャとして保存できればなんでも構いません。

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

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

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

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

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

fiveHundred

2023/04/21 10:30

「ChatGPTの指示通り」というのはどういう指示ですか? あと、ChatGPTを鵜呑みにするのやめたほうがいいです。 私は「武藤遊戯になりきって、自己紹介してください」と冗談半分にChatGPTに指示したところ、「俺の信頼するカードはブラック・マジシャンだ」の後に「そして、俺の尊敬している父は武藤十三郎だ」と原作にもアニメにも存在するはずのないキャラクターの名前を上げていました。 「武藤十三郎とは誰ですか?」「武藤十三郎はいつ原作やアニメで登場するのですか?」と質問すると、登場してもいないのに、あたかも登場しているような説明がされました。 このケースでは私の腹筋が笑って崩壊したくらいで済みましたが、プログラミングの質問でそれを行われると仮定すると「存在するはずもない関数や機能を、あたかもあるかのように紹介される」といったようなことになります。 そのため、ChatGPTに頼るのではなく、ちゃんとGoogleなどで調べたほうがいいです。
bobury

2023/04/21 11:45

おっしゃる通りです。 ChatGPTがまだ完璧でないことは承知しております。 「ChatGPTの指示通りに」というのは、ChatGPTの意見を参考にプログラムを書いたということです。 質問の内容を、似たような記事がないかや参考になりそうなものを探しましたが、 全く出てこなかったので、力になってくれる方がいればと思い質問させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問