저는 Geforce 330M에서 CUDA Toolkit 4.0으로 텍스처를위한 OpenCL-OpenGL interop을 시도하고 있습니다.CL/GL-Interop 용 OpenGL 텍스처 형식 유형이 잘못 되었습니까?
프레임을 캡처하고 그 데이터를 OpenCL 커널에 대한 입력 이미지 (Image2D
)로 사용하고 싶습니다. 커널은 데이터를 조작하고 첨부 된 OpenGL 텍스처가있는 이미지 객체 인 Image2DGL
에 데이터를 기록해야합니다. 기본적으로는 다음과 같습니다
_______________ 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);
}
편집 : 나뿐만 아니라
GL_UNSIGNED_INT
의 유형을 가질 수 있습니다. 내가 루프를 쓰고 있어요마다에서
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);
렌더링 : 다음
texMems.push_back(Image2DGL(clw->context, CL_MEM_READ_WRITE, GL_TEXTURE_RECTANGLE, 0, tex, &err));
내가 원본 이미지 (입력 이미지) 생성 : 다음
나는 공유 이미지 (Image2DGL
)를 작성 데이터를 srcImgBuffer
:
// write the frame to the image buffer
clw->queue.enqueueWriteImage(srcImgBuffer, CL_TRUE, origin, region, 0, 0, (void*)data, NULL, NULL);
또한 나는 커널 인수를 설정 해요 : 내가 획득하고 GL 객체를 해제 할
tex_kernel.setArg(0, texMems[0]);
tex_kernel.setArg(1, srcImgBuffer);
tex_kernel.setArg(2, width);
tex_kernel.setArg(3, height);
전후. 테스트 커널은 다음과 같습니다
__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 시도 (커널의 이미지에 float으로 쓰고 있음).
왼쪽 하나는 디코더의 밖으로 PPM
이며, 오른쪽에 하나 내가 다시 내 출력 텍스처 얻고 것입니다.
누군가가 실제로 여기까지 읽은 경우 : 문제를 해결하기 위해 텍스처 유형에 대한 제안 사항이 있으십니까?
편집 : 내가 직접 텍스처로 캡처 한 프레임을 결합하면, 비디오가 확인한다. 그래서 CL-GL 인터페이스와 관련이 있어야합니다.
Image2DGL에서 오류를 반환 했습니까? 직사각형 텍스처 대신 일반 2D 텍스처를 사용하면 어떻게됩니까? –
아니요, Image2DGL에서 오류가 없습니다. 2D를 시도한 후에 텍스쳐 좌표를 정규화하고 랩뿐만 아니라 Mag/Min 필터를 설정했지만 출력이 전혀 없습니다. – rdoubleui