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

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

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

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

Q&A

解決済

2回答

1610閲覧

Unityのシェーダーでローカル座標を基準に模様をつける

ulef

総合スコア20

Unity

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

0グッド

1クリップ

投稿2017/08/17 14:33

###前提・実現したいこと
Unityで、2Dゲームに使うため「中心点と半径を指定し、中心から波のように同心円状に色が広がっていく」ようなオブジェクトを作成しようとしています。

まさに以下のURLの最後の例「リングを動かす」のような感じです。
参考

###発生している問題・エラーメッセージ

この例ではワールド座標を基準に色を指定していますが、代わりにそのオブジェクトの中心を基準として描画するにはどうすれば良いでしょうか。

あるいは、上記の処理を実現できるのでしたらシェーダー以外の方法でも構いません。

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

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

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

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

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

guest

回答2

0

以下の方法で解決しました。
実行例

PosToShader.cs

1//これを目的のオブジェクトにアタッチ 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class PosToShader : MonoBehaviour { 7 8 private MaterialPropertyBlock p; 9 10 private Material mat=null; 11 12 private Renderer rend=null; 13 14 // Use this for initialization 15 void Start () { 16 rend = this.GetComponent<Renderer> (); 17 this.mat = rend.material; 18 p = new MaterialPropertyBlock (); 19 } 20 21 // Update is called once per frame 22 void Update () { 23 p.Clear (); 24 p.SetVector ("_ObjectPosition", transform.position); 25 26 rend.SetPropertyBlock(p); 27 28 } 29} 30

Shader.shader

1Shader "Custom/Shader" { 2 3 SubShader { 4 Tags { "RenderType"="Opaque" } 5 LOD 200 6 7 CGPROGRAM 8 #pragma surface surf Standard 9 #pragma target 3.0 10 11 struct Input { 12 float3 worldPos; 13 }; 14 15 float4 _ObjectPosition;//ここと 16 17 void surf (Input IN, inout SurfaceOutputStandard o) { 18 float dist = distance( _ObjectPosition, IN.worldPos);//ここを書き換え 19 float val = abs(sin(dist*3.0-_Time*100)); 20 if( val > 0.98 ){ 21 o.Albedo = fixed4(1, 1, 1, 1); 22 } else { 23 o.Albedo = fixed4(10/255.0, 10/255.0, 10/255.0, 0.3); 24 } 25 } 26 ENDCG 27 } 28 FallBack "Diffuse" 29} 30

投稿2017/08/19 20:10

ulef

総合スコア20

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

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

0

ベストアンサー

ご提示のサイトの例では、中心点をfloat dist = distance( fixed3(0,0,0), IN.worldPos);という風に(0,0,0)に決め打ちしている様子ですが、このfixed3(0,0,0)の代わりに、シェーダーに変数を追加して座標を外部から与えられるようにし、それを使うよう置き換えれば、任意の座標を中心に同心円を描けるかと思います(すみませんが今はUnityが手元になく、動作実験はしておりません)。

シェーダーに座標を受け渡す例としては、例えばこちらのサイトの記事などはいかがでしょう。

投稿2017/08/17 22:47

Bongo

総合スコア10807

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

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

ulef

2017/08/19 20:09 編集

教えて頂いたページを参考に、自己解決方法欄に記入した実装で目的のオブジェクトを作成できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問