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

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

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

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

Unity

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

Q&A

解決済

1回答

909閲覧

フラグメントシェーダでテクスチャの一部をクリッピングする方法

toyB

総合スコア2

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/03/27 15:57

フラグメントシェーダで_MainTexの一部の範囲をクリップしたいのですが、先ほど初めてシェーダについて勉強し始めたばかりで詰まってます。お力添えいただけないでしょうか。
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
clip(i.uv.y - 0.5);
return col;
}
のように書くと_MainTexのテクスチャの上から半分がクリッピングされると思うのですが、画像で言うと黒い範囲をクリッピングする場合はどのように指定すればいいのでしょうか?イメージ説明
画像は分かりやすく説明するために作ったもので、実際はこの黒い範囲はスクリプトから数値を変えられるようにしたいです。なのでクリッピング用のテクスチャは使用せずスクリプトから数値を変更してクリッピング範囲を変えていくことになります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

外部から幅を設定できるようにプロパティを追加して、それをもとにclipを行うことになるかと思います。
一例としては、下記のような形はいかがでしょうか。

ShaderLab

1Shader "Unlit/ClipTopCenterBottom" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 7 // 切り取り幅を設定するためのプロパティを追加 8 _Top ("Top", Range(0.0, 1.0)) = 0.1 9 _Center ("Center", Range(0.0, 1.0)) = 0.2 10 _Bottom ("Bottom", Range(0.0, 1.0)) = 0.1 11 } 12 SubShader 13 { 14 Tags { "RenderType" = "Opaque" } 15 Pass 16 { 17 CGPROGRAM 18 #pragma vertex vert 19 #pragma fragment frag 20 21 #include "UnityCG.cginc" 22 23 struct appdata 24 { 25 float4 vertex : POSITION; 26 float2 uv : TEXCOORD0; 27 }; 28 29 struct v2f 30 { 31 float2 uv : TEXCOORD0; 32 float4 vertex : SV_POSITION; 33 }; 34 35 sampler2D _MainTex; 36 float4 _MainTex_ST; 37 38 v2f vert(appdata v) 39 { 40 v2f o; 41 o.vertex = UnityObjectToClipPos(v.vertex); 42 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 43 return o; 44 } 45 46 // 切り取り幅を受け取る変数を追加 47 // スクリプトから値を設定したい場合、これら「_Top」「_Center」「_Bottom」の名前を引数に 48 // Material.SetFloatなどのユニフォーム変数設定用メソッドを使用する 49 float _Top; 50 float _Center; 51 float _Bottom; 52 53 fixed4 frag(v2f i) : SV_Target 54 { 55 // 下側...ご質問者さんの例示なさった「clip(i.uv.y - 0.5);」を可変にした形 56 clip(i.uv.y - _Bottom); 57 58 // 上側...V座標の上下を逆転し、下側と同様にクリッピングする形 59 clip(1.0 - i.uv.y - _Top); 60 61 // 中央...V座標の中央からの距離を求め、それをもとにクリッピングする形 62 clip(abs(i.uv.y - 0.5) - _Center * 0.5); 63 64 return tex2D(_MainTex, i.uv); 65 } 66 ENDCG 67 } 68 } 69}

投稿2022/03/27 21:52

編集2022/03/27 21:52
Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問