2012-01-30 19 views
5

私はGeForce 330MでCUDA Toolkit 4.0でテクスチャ用のOpenCL-OpenGL interopを試しています。CL/GL-InteropのOpenGLテクスチャ形式の種類が間違っていますか?

フレームをキャプチャし、そのデータをOpenCLカーネルの入力イメージ(Image2D)として使用したいとします。カーネルは、データを操作して、Image2DGLに書き込む必要があります。Image2DGLは、OpenGLテクスチャを添付したイメージオブジェクトです。基本的には以下のようになります。

_______________  RGB  _______________ 
|    | uint8*  |    | CL_RGBA/CL_UNORM_INT8 
| Grabber  | ------------> | Image2D  | -------------------------. 
| avcodec  |    | [input]  |       | 
|_______________|    |_______________|       | 
                      |  
                      V 
_______________     _______________      _______________ 
|    |    |    |      |    | 
| Texture  | ------------> | Image2DGL | <-----------------> | Kernel  | 
|_______________|    | [output] |      |_______________| 
           |_______________| 
Internal 
Format: GL_RGBA 
Format: GL_RGBA 
Type: ? 

私はそのような質感を初期化しています:

GLuint tex = 0; 

void initTexture(int width, int height) 
{ 
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_RECTANGLE, tex); 
// now here is where I need assistance: The type parameter of the Texture (GL_FLOAT) 
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
} 


EDIT:私も GL_UNSIGNED_INTの型を持つことができます。


その後、私は共有画像(Image2DGL)を作成します。

texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_WRITE, GL_TEXTURE_RECTANGLE, 0, tex, &err)); 

それから私は元画像(入力画像)を作成:私は書いているすべてのレンダリングループでは

ImageFormat format; 
format.image_channel_data_type = CL_UNORM_INT8; 
format.image_channel_order = CL_RGBA; 
srcImgBuffer = Image2D(clw->context, CL_MEM_READ_WRITE, format, width, height, 0, NULL, &err); 

をデータは、srcImgBuffer

// write the frame to the image buffer 
clw->queue.enqueueWriteImage(srcImgBuffer, CL_TRUE, origin, region, 0, 0, (void*)data, NULL, NULL); 

はまた、私は、カーネルの引数を設定している:私は取得しGLオブジェクトを解放しない

​​

前後。テストカーネルはそのようになります。

__kernel void init_texture_kernel(__write_only image2d_t out, __read_only image2d_t in, int w, int h) 
{ 
    const sampler_t smp = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST; 

    int2 coords = { get_global_id(0), get_global_id(1) }; 
    float4 pixel = read_imagef(in, smp, coords); 
    float4 test = { (float)coords.x/(float)w , 0, 0, 1}; 
    write_imagef(out, coords, pixel); 
} 
image_channel_data_type

カーネルのfloatとして読み取ることができ、正規化された値として解釈されます。出力画像が正しくないように見える、私は明らかに間違ったデータ解釈のためにスライスされた画像(ラインで)を持っている。私が言及したように、エラーはテクスチャの型の初期化の中にあると仮定します。私はGL_FLOATを試しました(私はカーネルのイメージにフロートとして書きます)。

Results: Image as PPM dump from the decoder (left), Texture output scattered (right)

左1は、デコーダのうちPPMで、右が私は私の出力テクスチャに戻ってきてるものです。

誰かが実際にここまで読んでいる場合:問題を解決するためにテクスチャの種類に関する提案はありますか?


EDIT:私は直接テクスチャにキャプチャしたフレームを結合した場合、ビデオは[OK]を果たしています。それで、何とかCL-GLインターフェースに関連しなければなりません。


+0

Image2DGLはエラーを返しましたか?そして、矩形テクスチャの代わりに通常の2Dテクスチャを使用するとどうなりますか? –

+0

いいえ、Image2DGLからのエラーはありません。 2Dを試してみました。テクスチャ座標を正規化し、Mag/Minフィルタとラップを設定しましたが、出力はありませんでした。 – rdoubleui

答えて

1

を私は最終的には明白なことを見ていない、解決策を考え出しました。私はRGBビデオを持っていた。私はRGBでフレームをキャプチャしました。これはきれいなテクスチャ上に表示することができます。しかし、バッファから一度に(カーネルコードに見られるように)3つのチャネルしか存在しない場合は、float4を手に取っても、これは混乱することになります。アー。

私はまた、行数を見て私の間違いを犯した可能性があります。私は、512行のうち要求された行のうち384個を得ました。これは、.75の比率になります。

私は単にRGBAを取得するために私のグラバー(libavcodecを使用して)を要求しました。それは4チャンネルの画像を持つためにそれを埋め込みます。

私はこの問題を閉鎖するようにフラグを立てます。

2

私はglTexture2Dにあなたの最後の引数がNULLの場合、フォーマットし、型引数ことができます任意の有効なOpenGLのフォーマット/タイプと信じている - しかし、彼らは使用されず、何も影響しません。あなたは浮動小数点テクスチャを持つようにしたい場合は、正しいinternal_format引数を渡すことで、それを指定する必要があります。

glTexImage2D(GL_TEXTURE_RECTANGLE, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL); 
+0

私のソースデータはuint8型ですが、私はテクスチャの対応タイプを探しています。私は実際に8bitデータ型を見ることができません。 – rdoubleui

+0

最初のようにテクスチャを一度初期化しないと、出力が見えないので、必要なときにそれを取ります。しかし、私は 'GL_RGBA8'や' GL_RGBA32F'を使うことができますが、違いはありません。私はそれを理解していない。 – rdoubleui

+0

glTexImage2Dの7番目と8番目の引数は、最後の引数で渡される形式とデータ型を指定します。 glTexImage2Dにデータを渡さないと、これらの2つの引数の値は何にも影響しません。 –

関連する問題