Q&A
何か解決したい問題があるわけではなくて、知識としての質問です。
例えば、以下のようなUnityのShaderファイルがあるとします。
HLSL
1Shader "Custom/Test" 2{ 3 Properties 4 { 5 _MainTex ("Main Texture", 2D) = "white" {} 6 _CopyTex ("Copy Texture", 2D) = "white" {} 7 } 8 SubShader 9 { 10 Tags { "RenderType"="Opaque" } 11 12 Pass 13 { 14 CGPROGRAM 15 #pragma vertex vert 16 #pragma fragment frag 17 18 #include "UnityCG.cginc" 19 20 struct appdata 21 { 22 float4 vertex : POSITION; 23 float2 uv : TEXCOORD0; 24 }; 25 26 struct v2f 27 { 28 float4 vertex : SV_POSITION; 29 float2 uv : TEXCOORD0; 30 }; 31 32 sampler2D _MainTex; 33 34 v2f vert (appdata v) 35 { 36 v2f o; 37 o.vertex = UnityObjectToClipPos(v.vertex); 38 o.uv = v.uv; 39 40 return o; 41 } 42 43 fixed4 frag (v2f i) : SV_Target 44 { 45 fixed4 col = tex2D(_MainTex, i.uv); 46 47 //Tex2D(_CopyTex, i.uv) = col; 48 49 return col; 50 } 51 ENDCG 52 } 53 } 54} 55
上記のように、フラグメントシェーダーでtex2Dを利用すれば、uv座標に対応する色情報を取得できます。
ふとした疑問なのですが、例えば、uv座標に対応する色情報を、書き換えるということはできないのでしょうか?
以下のように、値を代入するイメージです。
HLSL
1tex2D(_CopyTex, i.uv) = col;
ちなみに、このコードを試したところ、Unityで以下のようなエラーが表示されました。
Shader error in 'Custom/Test': undeclared identifier '_CopyTex' at line 47 (on d3d11) Compiling Vertex program Platform defines: UNITY_NO_DXT5nm UNITY_ENABLE_REFLECTION_BUFFERS UNITY_NO_CUBEMAP_ARRAY UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION
恥ずかしながら、ShaderやGPUの仕組みがよくわかっていないので、質問いたしました。
「そんなことできないよ」ということであれば、できないとお答えいただけますと幸いです。
できるのだとすれば、フラグメントシェーダーから利用できる巨大なバッファのように扱えるかなと思いまして。
開発環境
- Unity 2017.3.0f3
- Windows 10
- DirectX 11.0
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/02/05 23:33
2018/02/06 00:25
2018/02/06 00:34
2018/02/06 02:08
2018/02/06 02:31 編集