2012-01-09 8 views
6

私は、要素を修正しようとする前に、頂点を通過するだけの単純なジオメトリシェーダを作成しようとしています。GLSL 1.5シンプルなジオメトリシェーダ

マイ頂点シェーダがある

#version 150 core 
in vec3 inPosition; 
in vec4 inColor; 

out vec4 vertexColor; 

void main() { 
    vertexColor = inColor; 
    gl_Position = vec4(inPosition, 1.0); 
} 

すべてが正常に動作し、私のジオメトリシェーダは

#version 150 core 
layout (triangles) in; 
layout (triangle_strip, max_vertices=3) out; 

void main() { 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[2].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

ですそして、私のフラグメントシェーダは、リンクされたジオメトリシェーダがなけれ

#version 150 core 
in vec4 vertexColor; 
out vec4 fragColor; 

void main() { 
    fragColor = vertexColor; 
} 

です。しかし、ジオメトリシェーダをリンクすると、動作が停止します。私は行方不明で何ですか?私のジオメトリシェーダは私の頂点シェーダからのvertexColorの入力を必要としますか?

+0

http://ja.wikipedia.org/wiki/GLSL#A_sample_trivial_GLSL_geometry_shader? – n0rd

+0

それは私の質問に答えません。ジオメトリシェーダは、forループを除いて、そのページにリストされているものとまったく同じです。しかし、それは動作しません。何も描かれません。また、そのページに表示される頂点シェーダとフラグメントシェーダは、glsl 1用です。20私が理解していないこれらの情報を結びつけるのに問題があります。また、修正方法に関する情報を見つけることはできません。 – user1139069

答えて

7

マイジオメトリシェーダは、まさにそのページ

はいに記載されているものと同じですが、あなたの無料の頂点とフラグメントシェーダはないです。

情報は次のようにOpenGLパイプラインを通って流れます。まず、頂点シェーダが物を取得します。ジオメトリシェーダに出力を渡します(存在する場合)。ジオメトリシェーダは、その出力をフラグメントシェーダに渡します(もちろん、慣習的な三角形ラスタライズの後)。そしてフラグメントシェーダはその出力をブレンドステージに渡します。

頂点シェーダには、gl_PositionvertexColorという2つの出力があります。ただし、ジオメトリシェーダは、の入力を1つだけ受け取ります。gl_in[0].gl_Position。これはGLSLでは合法ではありません。あるステージが値を出力する場合、次のステージに入力する必要があります。唯一の例外は、gl_PositionのようなGLSL定義の値で、ラスタライザによって消費されます。

パススルーGSをパススルーにする場合は、実際にからまでのデータを渡す必要があります。

in vec4 vertexColor[]; 

ただし、GLSLのグローバル変数には同じ名前を付けることはできません。したがって、vertexColorを入力としてを出力として使用することはできません。ので、代わりに、あなたは、出力の名前を変更(またはinterface blocksを使用)する必要があります。

out vec4 gsColor; 

あなたのフラグメントシェーダは今in vec4 gsColor;を取り、それに働かなければなりません。

これらのシェーダをリンクしようとすると、コンパイラは、不一致について説明する適切な情報ログを与えていたはずです。シェーダーのリンクが失敗したときに情報ログを取得していますか?もしそうでなければ、あなたはすべきです。

+0

gsColorを配列にする必要があります。追加された頂点がなくなった場合、gsColor出力が追加された頂点とどのように一致しますか? gsColorが配列でなければならないと思いますが、その配列のインデックスは発光している頂点の順序と一致しますか? – user1139069

+0

ジオメトリシェーダの 'gl_Position'も配列ではありません。それぞれの出力を書き出し、 'EmitVertex'を呼び出してそれらの出力をすべて生成します。放出される頂点ごとに 'gl_Position'を設定するのと同じように、あなたが放出する頂点ごとに' gsColor'を設定します。 –

+0

なので 'gl_Position = gl_in [0] .gl_Position; gsColor = vertexColor [0] EmitVertex(); gl_Position = gl_in [1] .gl_Position; gsColor = vertexColor [1] EmitVertex(); '? – user1139069

関連する問題