EDIT:テクスチャターゲットをGL_TEXTURE_2D
に変更しました。だから、初期化が今のようになります。GL-CL-Interop:テクスチャ完全性のテスト
void initTexture(int width, int height)
{
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,
height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
}
それはGL_TEXTURE_2D
なので、ミップマップを定義する必要があります。どのようにOpenCL Image2Dの初期化に反映されるべきですか?
texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex, &err));
私はまだCL_INVALID_GL_OBJECT
を取得しています。だから問題はまだあります:OpenCL Image2Dの初期化の時点で、テクスチャの完全性をチェックするにはどうすればいいですか?
前のアプローチ:
私は avcodec とビデオファイルをデコードしています。結果はAVFrame
です。私はGL_TEXTURE_RECTANGLE_ARB
にフレームを表示することができます。
これはGL(GLEW)コンテキストの初期化に続いて、私のテクスチャの初期化からの抜粋です:
GLuint tex = 0;
void initTexture(int width, int height)
{
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB8, width,
height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
}
今、私はOpenCLのとOpenGLとの相互運用のためにImage2DGL
にtex
を割り当てます。 ImはNvidia Geforce 310M、Cuda Toolkitを使用しています。4. OpenGLバージョンは3.3.0、GLXバージョンは1.4です。
texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_WRITE, GL_TEXTURE_RECTANGLE_ARB, 0, tex, &err));
これは戻っています:
clCreateFromGLBuffer: -60 (CL_INVALID_GL_OBJECT)
これは、すべて私がループをレンダリングし始めているの前に起こっています。それ以降はテクスチャ上にビデオフレームを表示できます。テクスチャターゲット(GL_TEXTURE_RECTANGLE_ARB)は、対応するOpenGL拡張が有効(GL_ARB_texture_rectangle)であるため、OpenCLコンテキストに対して許可されます。今
OpenCLの1.1仕様状態のエラーの説明:
CL_INVALID_GL_OBJECTテクスチャタイプテクスチャの指定されたミップレベルが定義されていない場合、 texture_targetと一致する場合、または幅GLテクスチャオブジェクトでない場合または指定されたmiplevelの高さ がゼロです。
私はGL_TEXTURE_RECTANGLE_ARBを使用していますので、ミップマッピングはありません(わかっています)。しかし、私はNvidia OpenCL implementation notesでこの文だった見つけたもの:clCreateFromGLTexture2Dまたは clCreateFromGLTexture3Dへの呼び出しで指定されたテクスチャオブジェクトは、テクスチャ 完全にOpenGLのルールあたりとして不完全な場合
その後、コールはerrcode_retでCL_INVALID_GL_OBJECTを返します。
実際のテクスチャコンテンツを提供せずにテクスチャを初期化するだけの状態で、テクスチャの完全性を検証するにはどうすればよいですか?何か案は?
長方形のテクスチャは、GL 2.0以降のコア機能であり、OpenCLを実行できるカードであればコアで使用できます。この機能を拡張機能(ARBサフィックス)として使用しないでください。それはあなたの問題ではありませんが、あなたがしてはいけないことです。 –
なぜ矩形のテクスチャを使うのだろうと思います。 OpenGL-2の規則的なテクスチャは任意のサイズのものかもしれません。 – datenwolf
コメントのおかげで、矩形のテクスチャタイプを使用しました。だから私は代わりにGL_TEXTURE_2Dを使用する必要がありますか? – rdoubleui