OpenGL 3.2でフルスクリーンクワッドを描画するための最良の方法は何ですか?



Whats Best Way Draw Fullscreen Quad Opengl 3



解決:

頂点属性をそれぞれ-1/1に設定して、クワッドを作成する2つの三角形を送信できます。

頂点/フラグメントシェーダーでそれらに行列を掛ける必要はありません。



ここにいくつかのコードサンプルがありますが、それは単純です:)

頂点シェーダー:



const vec2 madd = vec2(0.5,0.5);属性vec2vertexIn;さまざまなvec2textureCoord; void main(){textureCoord = VertexIn.xy * madd + madd; //頂点属性を[0-1]の範囲にスケーリングしますgl_Position = vec4(vertexIn.xy、0.0,1.0); }

フラグメントシェーダー:

さまざまなvec2textureCoord; void main(){vec4 color1 = texture2D(t、textureCoord); gl_FragColor = color1; } 

フルスクリーンのクアッドジオメトリシェーダーを出力するには、次の方法を使用できます。

#version 330コアレイアウト(ポイント); layout(triangle_strip、ma​​x_vertices = 4)out; vec2texcoordを出力します。 void main(){gl_Position = vec4(1.0、1.0、0.5、1.0); texcoord = vec2(1.0、1.0); EmitVertex(); gl_Position = vec4(-1.0、1.0、0.5、1.0); texcoord = vec2(0.0、1.0); EmitVertex(); gl_Position = vec4(1.0、-1.0、0.5、1.0); texcoord = vec2(1.0、0.0); EmitVertex(); gl_Position = vec4(-1.0、-1.0、0.5、1.0); texcoord = vec2(0.0、0.0); EmitVertex(); EndPrimitive(); }

頂点シェーダーは空です:



#version330コアvoidmain(){}

このシェーダーを使用するには、空のVBOでダミーの描画コマンドを使用できます。

glDrawArrays(GL_POINTS、0、1); 

ジオメトリシェーダー、VBO、またはメモリを使用する必要はまったくありません。

頂点シェーダーはクワッドを生成できます。

layout(location = 0)out vec2 uv; void main(){float x = float(((uint(gl_VertexID)+ 2u)/ 3u)%2u); float y = float(((uint(gl_VertexID)+ 1u)/ 3u)%2u); gl_Position = vec4(-1.0f + x * 2.0f、-1.0f + y * 2.0f、0.0f、1.0f); uv = vec2(x、y); }

空のVAOをバインドします。 6つの頂点のドローコールを送信します。