gpt4 book ai didi

opengl - CL/GL-Interop 的 OpenGL 纹理格式类型错误?

转载 作者:行者123 更新时间:2023-12-02 03:21:00 25 4
gpt4 key购买 nike

我正在使用 CUDA Toolkit 4.0 在 Geforce 330M 上尝试 OpenCL-OpenGL 纹理互操作。

我想捕获一帧,使用该数据作为 OpenCL 内核的输入图像 ( Image2D )。内核应该操作数据并将其写入 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 );
}

<小时/> 编辑:我可以有一个类型 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);

此外,我正在设置内核的参数:

tex_kernel.setArg(0, texMems[0]);
tex_kernel.setArg(1, srcImgBuffer);
tex_kernel.setArg(2, width);
tex_kernel.setArg(3, height);

在我获取和释放 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 (因为我正在将 float 写入内核中的图像)。

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

左边的是PPM从解码器中出来,正确的就是我在输出纹理上得到的结果。

如果有人真正读到这里:您对纹理类型有解决问题的建议吗?

<小时/> 编辑:如果我将捕获的帧直接绑定(bind)到纹理,则视频可以正常播放。所以它一定与CL-GL接口(interface)有某种关系。

<小时/>

最佳答案

我相信,如果 glTexture2D 的最后一个参数为 NULL,那么格式和类型参数可以是任何有效的 OpenGL 格式/类型 - 但它们不会被使用,也不会影响任何东西。如果你想要浮点纹理,那么你必须通过传递正确的internal_format参数来指定它:

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

关于opengl - CL/GL-Interop 的 OpenGL 纹理格式类型错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9064181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com