GPU カードに OpenGL 4.2 が搭載されている場合imageStore()
、GLSL の関数を使用して、画像内の三角形 ID をマークすることができます。私の場合、画面上の事前定義されたウィンドウの背後にあるすべての三角形を検出する必要があります。ピッキング (ウィンドウ上でレンダリングされた三角形を選択すること) も同様に機能します。選択はリアルタイムで実行されます。
画像 (またはテクスチャ) の最大サイズは >= 8192x8192 = 64 M である必要があります。したがって、最大 64 M のプリミティブを使用できます (2、3 画像を使用する場合はさらに多くなります)。
画面の背後にあるすべての三角形 ID を保存するには、次のフラグメント シェーダーを使用します。
uniform uimage2D id_image;
void main()
{
color_f = vec4(0)
ivec2 p;
p.x = gl_PrimitiveID % 2048;
p.y = gl_PrimitiveID / 2048;
imageStore(id_image, p, uvec4(255));
}
画面にレンダリングされたすべての三角形 Id を保存するには: まず、深度バッファーを事前に計算し、次にわずかに異なるフラグメント シェーダーを使用します。
uniform uimage2D id_image;
**layout(early_fragment_tests) in;** //the shader does not run for fragment > depth
void main()
{
color_f = vec4(0)
ivec2 p;
p.x = gl_PrimitiveID % 2048;
p.y = gl_PrimitiveID / 2048;
imageStore(id_image, p, uvec4(255));
}