0

次のパイプラインを設定しています。

頂点シェーダーは入力として 4 つの頂点を取得し、三角形ストリップを使用して全画面クワッドとして描画します。

頂点シェーダー:

#version 420 core
layout(location = 0)  in vec4 position;
out gl_PerVertex 
{
vec4 gl_Position;

}
;
void main()
{
   gl_Position =  position; 
}

次に、ジオメトリ シェーダーでそれらの作業を行いたいと考えています。しかし、今のところ、シェーダーからトライアングル ストリップと同じ頂点を放出して、正常に動作することを確認します。

ジオメトリ シェーダー

#version 420 core

layout(invocations = 1,triangles) in; 
layout(triangle_strip, max_vertices =4) out;


out gl_PerVertex
{

  vec4 gl_Position;

};
void main() 
{

gl_Position = vec4( 1.0, 1.0, 0.0, 1.0 );

EmitVertex();

gl_Position = vec4(-1.0, 1.0, 0.0, 1.0 );

EmitVertex();

gl_Position = vec4( 1.0,-1.0, 0.0, 1.0 );

EmitVertex();

gl_Position = vec4(-1.0,-1.0, 0.0, 1.0 );

EmitVertex();

EndPrimitive(); 

}

そしてフラグメントシェーダー:

 #version 420 core

 layout(binding=0) uniform sampler2D   COLOR_MAP_0;

 out vec4 OUTPUT;

 void main(void) {

  OUTPUT =  vec4(1,0,0,1); 


 }

クライアント側の設定は次のようになります。

    glm::vec4 va[4] ={glm::vec4(1.0, 1.0, 0.0, 1.0),glm::vec4(-1.0, 1.0, 0.0, 1.0),glm::vec4(  1.0,-1.0, 0.0, 1.0),glm::vec4(-1.0,-1.0, 0.0, 1.0)};
        auto ss = sizeof(va); 
    glGenVertexArrays(1,&_dummyVao);
    glBindVertexArray(_dummyVao);
    glGenBuffers(1,&_dummyPoinBuff);
    glBindBuffer(GL_ARRAY_BUFFER, _dummyPoinBuff);
    glBufferData(GL_ARRAY_BUFFER,  ss, &va[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, ((GLubyte *)NULL + (0)));
    glEnableVertexAttribArray(0);
    glBindVertexArray(0);

ドローコール:

glBindVertexArray(_dummyVao);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);

奇妙なことは、それが機能しないことです!出力は空です.代わりにポイントを放出するように切り替えると、それらを放出します.頂点データは 100% 正しいです.ジオメトリ シェーダをデタッチすると、クワッドが正常に描画されます.何ここで間違っている可能性がありますか?

アップデート:

このバリエーションは機能します。

 const vec2 vert_data[4] = vec2[](
           vec2(-1.0, 1.0), 
           vec2(-1.0, -1.0), 
           vec2(1.0, 1.0), 
           vec2(1.0, -1.0) 
         );


for(int i=0; i<4; i++)
  {
gl_Position = vec4( vert_data[i].xy,0,1);///gl_Position;
EmitVertex();
  }
  EndPrimitive();

ジオメトリ シェーダーの入力/出力の Redclare はまだ役に立たなかった:

in gl_PerVertex
{
  vec4 gl_Position;

} gl_in[];
out gl_PerVertex
{
  vec4 gl_Position;

};
4

0 に答える 0