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

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

ただいまの
回答率

90.83%

  • Unity

    3391questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • HLSL

    13questions

    HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

Unity|自作したシェーダーをつけたマテリアルが一番上に表示されてしまう問題

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 84

MemoT

score 4

Unityで、写真の解像度をコントロールするためのシェーダーを作りました。
コピペベースで作成したため、中身を全て読めないのですが、掲題の通り、シェーダーに紐付けたマテリアルが最優先で一番上に表示されてしまう現象が起きています。表示順位をヒエラルキーの階層と同じくしたいのですが、ご教授いただけますでしょうか。

Shader "Unlit/Transparent Colored Blurred"
{
  Properties
  {
    _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
    _Distance ("Distance", Float) = 0.015
  }

  SubShader
  {
    LOD 100

    Tags
    {
      "Queue" = "Transparent"
      "IgnoreProjector" = "True"
      "RenderType" = "Transparent"
    }

    Cull Back
    Lighting Off
    ZWrite Off
    ZTest LEqual 
    Fog { Mode Off }
    Offset -1, -1
    Blend SrcAlpha OneMinusSrcAlpha

    Pass
    {
      CGPROGRAM
      #pragma vertex vertexProgram
      #pragma fragment fragmentProgram

      #include "UnityCG.cginc"

      struct appdata_t
      {
        float4 vertex : POSITION;
        float2 textureCoordinate : TEXCOORD0;
        fixed4 color : COLOR;
      };

      struct vertexToFragment
      {
        float4 vertex : SV_POSITION;
        half2 textureCoordinate : TEXCOORD0;
        fixed4 color : COLOR;
      };

      sampler2D _MainTex;
      float4 _MainTex_ST;
      float _Distance;

      vertexToFragment vertexProgram (appdata_t vertexData)
      {
        vertexToFragment output;
        output.vertex = UnityObjectToClipPos(vertexData.vertex);
        output.textureCoordinate = TRANSFORM_TEX(vertexData.textureCoordinate, _MainTex);
        output.color = vertexData.color;
        return output;
      }

      fixed4 fragmentProgram (vertexToFragment input) : COLOR
      {
        float distance = _Distance;
        fixed4 computedColor = tex2D(_MainTex, input.textureCoordinate) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x + distance , input.textureCoordinate.y + distance )) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x + distance , input.textureCoordinate.y)) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x , input.textureCoordinate.y + distance )) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x - distance , input.textureCoordinate.y - distance )) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x + distance , input.textureCoordinate.y - distance )) * input.color;




        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x - distance , input.textureCoordinate.y + distance )) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x - distance , input.textureCoordinate.y)) * input.color;
        computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x , input.textureCoordinate.y - distance )) * input.color;
        computedColor = computedColor / 9;

        return computedColor;
      }
      ENDCG
    }
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

このコード自体には、ご質問者さんのおっしゃる現象に影響しそうな部分は特になさそうに見えます。

「ヒエラルキーの階層と同じく...」とおっしゃっているということは、表示したい各オブジェクトはUIオブジェクト(Imageなど)でしょうか?
ですが、ちょっと試してみたところでは、どうやらご提示のコードで問題なく前後関係を表現できているようです。

UIオブジェクトではないとしたら、その場合はそもそもヒエラルキー上の親子関係・兄弟関係というのは、描画順序決定には寄与していないんじゃないかと思います(参考:UnityのSpriteRendererとRendererの描画順ルール - 渋谷ほととぎす通信)。
Sorting Layerも同じ、Order In Layerも同じ、カメラからの距離も同じ場合、ヒエラルキー上の位置を変更しても描画順は変化していないように見えました(おそらくオブジェクトを生成した順序に従っているように見えますが不確かです)。

これら描画レイヤー周りの設定はどうなっていますでしょうか?
多分、描画順序についてはこの辺の設定調整で制御してやるのが妥当な方法のように思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Unityでディスプレイスマップを使うとしたら・・?

    少し気になった程度の事ですが質問させて下さい。 Unityでディスプレイスマッピングを使う場合はどの様な形で 実装しているのでしょうか?1例の概略といった所でも良いのですが

  • 解決済

    Unity-テクスチャを1マスごとに敷きつめる

    オブジェクトの表面にタイルのように画像を繰り返して敷き詰めたいです。 マテリアルのTilingを設定する方法を試したのですが、 これだとサイズの違うオブジェクトに対して、Til

  • 解決済

    WebCamTextureを使ってRGBの値をリアルタイムで変更したいです。

    これで指定キーを押したら指定したRGBの値に変更するというコードを書きたいのですが、よくよくは白黒やセピアのようなものにしたいとも思ってますが初歩的なところで躓いてしまい先に進めま

  • 解決済

    unity shaderで音を出す

    unityのshaderで「~~~なら音をだす」という記述の仕方が分かりません。 追記 http://noshipu.hateblo.jp/entry/2016/04/21/1

  • 解決済

    Unityで影だけを表示させたい

    Unityでゲームオブジェクトを、ライトで真上から照らした光沢にしつつ、それに付く影はライトを上斜めから当てた感じで表示させたいと考えています。 Dlirectional ligh

  • 解決済

    PostProcessingStackの効果が重複してしまう

    Unityでスマホ向けのアプリを制作しています。 アセットのPostProcessingStackを使って画面効果を付与しているのですが、メインカメラとは別にUI用のカメラを用

  • 受付中

    shaderについて

    現在unityでshaderを勉強しているものです。 shaderで2値表示をしたいと思っています。 以下のサイト https://ics.media/entry/5535 を参考

  • 解決済

    Transparentなunlitシェーダに影を落としたい

    初心者なので、一部とんちんかんなことを言っているかもしれませんがご容赦くださいmm  解決したいこと Unlit/Transparentなシェーダのマテリアルを適用したquad

同じタグがついた質問を見る

  • Unity

    3391questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • HLSL

    13questions

    HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。