私はレイキャスティング、レイマーチングなどのOpenCLでグラフィックス計算を行うつもりです。そして、私はこの計算(ピクセル画像)の結果を表示するためにOpenGLを使用したいと思います。フレームバッファにテクスチャバッファを付けて使用します。 OpenCLは結果をテクスチャに書き込み、glBlitFrameBuffer関数を使ってテクスチャデータをアプリケーションウィンドウのフレームバッファにコピーします。 私は、CL/GL間の問題を実装中に満たしました。私はそれを示す簡単な例を書いた。この例は、フレームバッファオブジェクトとテクスチャオブジェクトの初期化、それらの結合、GLテクスチャバッファからのOpenCLバッファの作成を示しています。最後に、メインレンダーループが表示されます。各フレームに新しいデータを含むテクスチャ書き込み、フレームバッファの添付とこのフレームバッファのコピーから構成されます。GL/CL相互運用性:共有テクスチャ
テクスチャ初期化:
for (int i = 0; i < data.Length; i +=4) {
data [i] = 255;
}
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte>(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0)
TBO + FBO初期化:
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);
CL/GL初期化:
bufferID = CL.CreateFromGLTexture2D (context, memInfo, textureTarget, mipLevel, glBufferObject, out errorCode);
レンダリングループ:
for (int i = 0; i < data.Length; i += 4) {
data [i] = tt;
}
tt++;
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte> (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, fboID [0]);
GL.ReadBuffer (ReadBufferMode.ColorAttachment0);
GL.DrawBuffer (DrawBufferMode.Back);
GL.BlitFramebuffer (0, 0, w, h, 0, 0, w, h, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest);
GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, 0);
一見すると、このコードは奇妙に見えますが、それは私の問題を完全に示しています。 CLはここではまったく動作しません。このアプリケーションでは、OpenCLコンテキストが作成され、OpenCLバッファの初期化が行われます。 これの作業は簡単でなければなりません。画面の色が黒から赤に変わります。そして、このようには機能しません。色は最初の赤色(テクスチャの初期化)から変化しません。 しかし、私はCL/GL初期化(GLテクスチャからCLバッファを作成する)をコメントすると正常に動作します。 なぜそうですか?なぜGLバッファの動作がCLの添付ファイルによって変わるのですか?それを修正して動作させるには?
私は最終的にこの現象を確認できます。Image2DGLオブジェクトがテクスチャにバインドされると、テクスチャはブロックされ、別のコンテキストとの間でやりとりできません。これはNVIDIAデバイス上にもあります。とにかくブロックされた場合、明示的な 'acquire'と' release'がなぜあるのでしょうか? – rdoubleui