【Unity・シェーダ】 「頂点シェーダ(Vert)からのOutput情報」を「ピクセルシェーダー(frag)」内で受け取りたい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 908
【Unity・シェーダ】 「頂点シェーダ(Vert)からのOutput情報」を「ピクセルシェーダー(frag)」内で受け取りたい
シェーダーを初めて1週間の初心者なので以下をご教示お願いします。
やりたい事
「[Unity]コンピュートシェーダ(GPGPU)で1万個のパーティクルを動かす」と言う記事を参考に、
「パーティクル毎にテクスチャを変更するシェーダーを組みたい」と思い、苦戦しております。
_MainTexn,_TexBuffer0,_TexBuffer1にテクスチャを入れ込み
vert()内で「output.texID」を設定。(これが上記どのテクスチャを使用するのかのID)
frag()内でoutput.texIDを元にどのテクスチャの表示を切り替えたい。
発生している問題
「頂点シェーダ(Vert)からのOutput情報」が「ピクセルシェーダー(frag)」内で
どうやら取得出来ていない状態です。
(そもそもピクセルシェーダーでが出来るかも解らない状態です)
該当のシェーダー抜粋
// テクスチャ
sampler2D _MainTex;
sampler2D _TexBuffer0;
sampler2D _TexBuffer1;
// 構造体
struct Sprite
{
float3 pos;
float3 rotation;
float4 col;
float4 uv;
int texID;
};
// 構造化バッファ
StructuredBuffer<Sprite> sprites;
// ----------------------------------------
// 頂点シェーダ
struct VS_OUTPUT
{
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
float4 col : COLOR;
// ★★★仮にテクスチャのIDをいれている★★★
int texID : TEXCOORD1;
}
VS_OUTPUT vert(uint id : SV_VertexID)
{
VS_OUTPUT output;
UNITY_INITIALIZE_OUTPUT(VS_OUTPUT,output); // この行を追加
output.pos = float4(sprites[id].pos, 1);
output.uv = sprites[id].uv;
output.col = sprites[id].col;
output.texID = sprites[id].texID;
// ★★★コメントアウトを解いて強引に「1」と入れてもfrag()内のi.texIDで判別できない★★★
//output.texID = 1;
return output;
}
// ----------------------------------------
// ジオメトリシェーダ
[maxvertexcount(4)]
//void geom(point _GS_OUTPUT input[1], inout TriangleStream<_GS_OUTPUT> outStream)
void geom(point VS_OUTPUT input[1], inout TriangleStream<GS_INPUT> outStream)
{
// VS_OUTPUT input[0]を元にして頂点計算等をしている。
//割愛します。
}
// ----------------------------------------
// ピクセルシェーダー
fixed4 frag(VS_OUTPUT i) : COLOR
{
float4 col = 0;
half2 uv = i.uv.xy;
float tex_id = i.texID;
if(i.texID == 1)
{
col = tex2D(_TexBuffer0, uv) * i.col;
}
else if(i.texID == 2)
{
col = tex2D(_TexBuffer1, uv) * i.col;
}
else
{
// ★★★IDが認識できていないのか必ずここにきてしまう…★★★
col = tex2D(_MainTex, uv) * i.col;
}
// 色を返す
return col;
}
補足情報(FW/ツールのバージョンなど)
unity2017.2.1f1
シェーダーモデル5.0
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.19%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる