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、max_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つの頂点のドローコールを送信します。