2017-11-23 12 views
0

シェーダーを統一的に開発しています。シェーダには頂点シェーダ、フラグメントシェーダ、ジオメトリシェーダが含まれている必要がありますが、最初の2つはうまく動作しますが、ジオメトリシェーダに問題があります。ジオメトリシェーダーが機能しません(unity3d)

次のコードを使用すると、シェーダがちょうどピンクになるシェーダオブジェクトが表示されますが、シェーダのコンパイルエラーは発生しません。ジオメトリシェーダを削除するだけで、すべてが正常に動作します。

現在の実装では、入力データを出力するだけで、何もしないでください。

もう1つ興味深いのは、Unityがジオメトリシェーダの内容を無視する可能性があるということです。これからすべてを削除すると、オブジェクトはまだピンクです。私の理解では、この場合は何も表示されません。

私が使用しているコード:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' 

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' 

Shader "Custom/VoidCircle" 
{ 
    Properties 
    { 
     _MainTex ("Texture", 2D) = "white" {} 
     _Progress ("Progress", float) = 0.4 
    } 
    SubShader 
    { 
     Tags { "RenderType"="Opaque" } 
      Blend SrcAlpha OneMinusSrcAlpha 
     LOD 100 

     Pass 
     { 
      CGPROGRAM 

      #pragma geometry geom 
      #pragma vertex vert 
      #pragma fragment frag 

      struct appdata 
      { 
       float4 vertex : POSITION; // vertex position 
       float2 uv : TEXCOORD0; // texture coordinate 
      }; 

      struct v2f 
      { 
       float2 uv : TEXCOORD0; // texture coordinate 
       float4 vertex : SV_POSITION; // clip space position 
      }; 

      v2f vert (appdata v) 
      { 
       v2f o; 
       o.vertex = UnityObjectToClipPos(v.vertex); 
       o.uv = v.uv; 
       return o; 
      } 

      // ALL THE PROBLEMS ARE HERE   
      [maxvertexcount(3)] 
      void geom(triangle v2f input[3], inout TriangleStream<v2f> OutputStream) 
      {   
       for (int i = 0; i < 3; i++) { 
        OutputStream.Append(input[i]); 
       }    
      } 

      sampler2D _MainTex; 
      float4 _MainTex_TexelSize; 

      float4 frag (v2f i) : SV_Target 
      { 

       float4 col = tex2D(_MainTex, i.uv); 
       float besta = 0; 
       int d = 1;   

       for (int x = -d; x <= d; x++) { 
        for (int y = -d; y <= d; y++) { 
         float4 col1 = tex2D(_MainTex, i.uv + fixed2(_MainTex_TexelSize.x * x, _MainTex_TexelSize.y * y)); 
         if (col1.a > besta) { 
          besta = col1.a; 
         } 
        } 
       } 

       if (col.a > 0) { 
        return float4(col.a, col.a, col.a, 1); 
       } else { 
        return float4(0, 0, 0, besta); 
       } 

      } 
      ENDCG 
     } 
    } 
} 

答えて

0

は問題を得ました。ジオメトリシェーダは、誤解がなければOpenGL 3.1からサポートされています。私のハードウェアはOpenGL 3.0を実装しています

関連する問題