2012-01-26 3 views
3

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との相互運用のためにImage2DGLtexを割り当てます。 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を返します。

実際のテクスチャコンテンツを提供せずにテクスチャを初期化するだけの状態で、テクスチャの完全性を検証するにはどうすればよいですか?何か案は?

+2

長方形のテクスチャは、GL 2.0以降のコア機能であり、OpenCLを実行できるカードであればコアで使用できます。この機能を拡張機能(ARBサフィックス)として使用しないでください。それはあなたの問題ではありませんが、あなたがしてはいけないことです。 –

+1

なぜ矩形のテクスチャを使うのだろうと思います。 OpenGL-2の規則的なテクスチャは任意のサイズのものかもしれません。 – datenwolf

+0

コメントのおかげで、矩形のテクスチャタイプを使用しました。だから私は代わりにGL_TEXTURE_2Dを使用する必要がありますか? – rdoubleui

答えて

4

Image2DGLを作成できなかった問題を解決できました。 Iが正常(clCreateFromGLTexture2Dと等価である)Image2DGLを作成することができたGL_RGBAを指定することにより

void initTexture(int width, int height) 
{ 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

:私にTexture2D 4チャネル内部フォーマットを指定するために欠けていました。これは、テクスチャの完全性を求める要求を満たしたようです。

+0

お世話になりました。私が理解できないのは、なぜその行にglBindTexture(GL_TEXTURE_2D、0)が必要なのかということです。なぜなら私たちはすでに3行目に再びバインドしているから、なぜそれをする必要があるのだろうか。あなたのソリューションからのものは私のために働いています...今すぐ生成されるOpenCLテクスチャは、そのテクスチャテクスチャから来ます。最も早く再生してください – Megharaj

+0

+1それは私の問題も解決したので –

関連する問題