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

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

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

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

Unity

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

HLSL

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

Q&A

解決済

2回答

6274閲覧

Unityのシェーダーで調べても出てこないので・・・

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

Unity

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

HLSL

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

0グッド

0クリップ

投稿2016/04/04 01:01

現在、画像がありそれをオブジェクトに対しスクリーン座標で映して、カメラから見た時画像がそのまま見えるような形にしています。
ここから、描画点(?)とカメラを繋ぐベクトルと法線ベクトルの角度が一定以上を超えると透明になるようにしたいと思っています。
いわゆるリムライティングというものの光る部分を透明にしようという感じです。
このコードでは透明にすることができているかの確認のためにX座標に対して透明度を設定していて、主にその部分を書き換えて目標を達成しようとしていますが、どうやってデータを参照し角度を求めるのかの書き方がわかりません。

Cg/HLSL

1SubShader{ 2 Pass{ 3 Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" } 4 Blend SrcAlpha OneMinusSrcAlpha 5 CGPROGRAM 6 #include "UnityCG.cginc" 7 #pragma vertex vert 8 #pragma fragment frag 9 #pragma target 3.0 10 11 uniform sampler2D _MainTex; 12 13 float4 vert(appdata_base v) : POSITION{ 14 return mul(UNITY_MATRIX_MVP, v.vertex); 15 } 16 fixed4 frag(float4 sp : WPOS) : COLOR{ 17 //fixed4 col = fixed4(float2(sp.x / _ScreenParams.x,1-sp.y / _ScreenParams.y),0,1); 18 fixed4 col = tex2D(_MainTex,(float2(sp.x / _ScreenParams.x,1 - sp.y / _ScreenParams.y + 0.059))); 19 fixed alpha = sp.x / _ScreenParams.x;//この部分でアルファ値を演算 20 col.a = alpha; 21 return col; 22 } 23 24 ENDCG 25 } 26 }

あとWPOSとVPOSの違いってなんですか

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

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

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

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

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

guest

回答2

0

ベストアンサー

一応自己解決しました。尚、Unity上ではなくビルドしてでないと位置がずれる。
Unity上で動かす場合、SV_POSITIONがUnityのウィンドウ全体からの座標で_ScreenParamsが描画している小窓の座標という違いで変になるみたい。

SubShader{ Pass{ Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" } Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM // Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members normalDirection,viewDirection) //#pragma exclude_renderers d3d11 xbox360 #include "UnityCG.cginc" #pragma vertex vert #pragma fragment frag //#pragma target 3.0 uniform sampler2D _MainTex; struct v2f { float4 pos : SV_POSITION; float3 viewDirection : TEXCOORD0; float3 normalDirection : TEXCOORD1; }; //extern v2f v; v2f vert(appdata_base i){ v2f o; o.pos = mul(UNITY_MATRIX_MVP, i.vertex); float4x4 modelMatrix = _Object2World; float4x4 modelMatrixInverse = _World2Object; o.normalDirection = normalize(mul(i.normal, modelMatrixInverse)).xyz; o.viewDirection = normalize(_WorldSpaceCameraPos - mul(modelMatrix, i.vertex).xyz); return o; } half4 frag(v2f v) : COLOR{ //fixed4 col = fixed4(float2(sp.x / _ScreenParams.x,1-sp.y / _ScreenParams.y),0,1); //fixed4 col = tex2D(_MainTex,(float2(sp.x / _ScreenParams.x,1 - sp.y / _ScreenParams.y + 0.059))); //half4 col = half4(0,1,0,1); //half4 col = half4(half2(fmod(v.pos.x / _ScreenParams.x,1),fmod(v.pos.y / _ScreenParams.y,1)),0,1); //half4 col = half4(half2(v.pos.x,v.pos.y),0,1); half4 col = tex2D(_MainTex,float2(v.pos.x / _ScreenParams.x,1 - v.pos.y / _ScreenParams.y)); //half4 col = half4(half3(abs(dot(v.viewDirection, v.normalDirection)),0,0),1); col.a = abs(dot(v.viewDirection, v.normalDirection)); //fixed alpha = sp.x / _ScreenParams.x; //col.a = alpha; return col; } ENDCG }

投稿2016/04/04 19:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

GLSLの記述なのであれですが、前に自分が書いたこの記事が参考になりますかね。
http://qiita.com/edo_m18/items/63df01d0efe394c515b0

ちなみにカメラの方向と法線による角度からなにかしらの計算を行う場合、内積を取ることで角度が求められます。
(今回の例で言えば角度を求めるまでもなく、たんに内積の結果を用いるだけで目的は達成できると思います)

具体的に言うと、法線の方向がカメラの方向にぴったり一致しているときが1、逆に垂直に近づいていくに連れて0に近づいていくので、このあたりの数値をパラメータにすることで達成できると思います。

投稿2016/04/04 02:45

edo_m18

総合スコア2283

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

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

退会済みユーザー

退会済みユーザー

2016/04/04 03:10

内積の求め方はなんとなくわかるんですけど、問題なのがベクトルデータなんですよね。 その記事で言うdot(viewDirection, normalDirection)に至るまでの参照の仕方。書き方がわからない・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問