私は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を試しました(私はカーネルのイメージにフロートとして書きます)。
左1は、デコーダのうちPPM
で、右が私は私の出力テクスチャに戻ってきてるものです。
誰かが実際にここまで読んでいる場合:問題を解決するためにテクスチャの種類に関する提案はありますか?
EDIT:私は直接テクスチャにキャプチャしたフレームを結合した場合、ビデオは[OK]を果たしています。それで、何とかCL-GLインターフェースに関連しなければなりません。
Image2DGLはエラーを返しましたか?そして、矩形テクスチャの代わりに通常の2Dテクスチャを使用するとどうなりますか? –
いいえ、Image2DGLからのエラーはありません。 2Dを試してみました。テクスチャ座標を正規化し、Mag/Minフィルタとラップを設定しましたが、出力はありませんでした。 – rdoubleui