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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

9742閲覧

Unlit Shaderでこれから描画するポイントのワールド座標を出したい

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2018/08/23 19:21

編集2018/08/24 07:32

実現したいこと

Unity3Dにて、
これから作りたいと考えているシェーダー(Unlit Shader)を実装するために、「ピクセルが描画するポイントの座標」が必要になりました。
(ピクセルごとにレイを飛ばしてあたった座標を返すイメージ)
イメージ説明
ですが、私なりに方法を調べましたが、期待通りの結果になるような物は分かりませんでした。
もしよろしければご教授いただけると幸いです。

その他(バージョンなど)

Unity 2018.2.5f1を使用
(私のUnity歴が浅いため、かなり文章がおかしいかもしれません、ご了承ください。)

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

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

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

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

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

sakura_hana

2018/08/23 23:46

試行錯誤した内容とUnityのバージョンを記載してください。参考→https://teratail.com/help/question-tips
sakura_hana

2018/08/24 06:19 編集

そもそもですが「セルが描画するポイント」って何ですかね?(ポリゴンの頂点かと思っていたんですが……それでいいなら「unity ポリゴン 頂点座標」でググって出て来るページが参考になるかと→http://nn-hokuson.hatenablog.com/entry/2017/06/06/202953) 「このようなコードを書いてみたところ、〇〇という結果が出た。本来は〇〇という結果が出てほしい」などを追記すると解決しやすくなると思います。
退会済みユーザー

退会済みユーザー

2018/08/24 15:08 編集

修正依頼ありがとうございます、 セルなどの表現がおかしかったので修正しました。(あと画像も追加しました) また悩んでいるのはコードを前のどういう処理にするか考えてる段階で止まっている状態なので、試行錯誤した内容は書けないです、すいません...
guest

回答1

0

ベストアンサー

そのUnlitシェーダー内で、ピクセルのワールド座標を使って何かしたいということでしょうか?

sakura_hanaさんにご紹介いただいた【Unityシェーダ入門】ポリゴンをポイント(点)で表現する - おもちゃラボの中で、ピクセルのY座標に応じて色を付けている箇所がありますが、これと同じ手法が使えるのではないでしょうか。

たとえば下記のようにすると...

ShaderLab

1Shader "Unlit/WorldPosition" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 } 7 SubShader 8 { 9 Tags { "RenderType"="Opaque" } 10 LOD 100 11 12 Pass 13 { 14 CGPROGRAM 15 #pragma vertex vert 16 #pragma fragment frag 17 // make fog work 18 #pragma multi_compile_fog 19 20 #include "UnityCG.cginc" 21 22 struct appdata 23 { 24 float4 vertex : POSITION; 25 float2 uv : TEXCOORD0; 26 }; 27 28 struct v2f 29 { 30 float2 uv : TEXCOORD0; 31 UNITY_FOG_COORDS(1) 32 33 // v2fにワールド座標伝達用のfloat3を追加 34 // セマンティクスは適当なTEXCOORDを使えばいいでしょう 35 // (「TEXCOORD」という名前ですが、テクスチャ座標に限らず自由に使って構わないかと思います) 36 // すでにTEXCOORD0はテクスチャUV用、TEXCOORD1はフォグ効果用に使われてしまっているので 37 // TEXCOORD2を使うことにしました 38 // もしテクスチャ座標やフォグ効果が不要なら削除してしまい、空いたTEXCOORDを利用してもOKです 39 float3 worldPos : TEXCOORD2; 40 41 float4 vertex : SV_POSITION; 42 }; 43 44 sampler2D _MainTex; 45 float4 _MainTex_ST; 46 47 v2f vert (appdata v) 48 { 49 v2f o; 50 o.vertex = UnityObjectToClipPos(v.vertex); 51 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 52 UNITY_TRANSFER_FOG(o,o.vertex); 53 54 // モデルの頂点座標をモデル変換行列(unity_ObjectToWorld)で変換し 55 // ワールド座標にして、それのxyzをworldPosに渡す 56 o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; 57 58 return o; 59 } 60 61 fixed4 frag (v2f i) : SV_Target 62 { 63 // sample the texture 64 fixed4 col = tex2D(_MainTex, i.uv); 65 // apply fog 66 UNITY_APPLY_FOG(i.fogCoord, col); 67 68 // 先ほどのo.worldPos(頂点のワールド座標)は頂点間で線形補間され、フラグメントシェーダー内で 69 // 取り出したi.worldPosは「ピクセルのワールド座標」になっている 70 // 試しに、xyzそれぞれに2を足して4で割り、-2~2 → 0~1となるようにして、 71 // これでcolのrgbを上書きしてみると、ワールド座標に応じてピクセルがカラフルに塗られる 72 // なお、-2~2の範囲を超えた部分は0~1の範囲から外れるため、色が飽和して変化がなくなる 73 col.rgb = (i.worldPos + float3(2.0, 2.0, 2.0)) / 4.0; 74 75 return col; 76 } 77 ENDCG 78 } 79 } 80} 81

下図のように、ピクセルのワールド座標を色として可視化することができました。

プレビュー

投稿2018/08/24 21:10

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問