C++ write_imagef似乎不会更改任何值

C++ write_imagef似乎不会更改任何值,c++,opengl,opencl,glteximage2d,C++,Opengl,Opencl,Glteximage2d,我正在尝试使用opencl编写纹理数据,并使用opengl显示它。目标是比较有无互操作性的性能。但现在我无法生成纹理本身。我首先想尝试在没有互操作性的情况下实现这一点: cl缓冲区初始化和内核创建: this->imageBuffer = new cl::Image2D(*context, CL_MEM_WRITE_ONLY, cl::ImageFormat(CL_RGBA, CL_FLOAT), this->width, this->height); //this->i

我正在尝试使用opencl编写纹理数据,并使用opengl显示它。目标是比较有无互操作性的性能。但现在我无法生成纹理本身。我首先想尝试在没有互操作性的情况下实现这一点:

cl缓冲区初始化和内核创建:

this->imageBuffer = new cl::Image2D(*context, CL_MEM_WRITE_ONLY, cl::ImageFormat(CL_RGBA, CL_FLOAT), this->width, this->height); //this->imageBuffer is a cl::Image*

//create kernel
this->kernel = new cl::Kernel(program, "simple_kernel");

//set kernel arguments
this->kernel->setArg(0, *(this->imageBuffer));
this->kernel->setArg(1, this->offset); 
内核执行(在循环中发生):

我为类似问题找到的所有解决方案都与内部格式和glTexImage2D中使用的格式(在OpenGL渲染部分的开头使用)有关,因此这里可能实际上是同一个问题,但我不知道我做错了什么

预期结果将是一个红色的四边形。但它只显示初始化的纹理(在本例中为白色,如果初始化为0.0f则为黑色,如果初始化为0.4f则为灰色)。通过让writeImage排队,我能够缩小内核似乎根本不改变缓冲区的范围。如果writeImage被注释掉,它将显示一个黑色的四边形。因此,读取缓冲区似乎是可行的,因为在这种情况下,它会读取一个空缓冲区(导致黑色四元)

这一点通过以下事实得到了加强:奇特的输出(在内核执行部分的末尾使用)只打印初始化值(例如1s或0.4s。或者在不使用writeImage时打印0s)

首先,您的“奇特输出”部分是错误的。 您的图像具有宽度*高度*4浮动元素。将其视为具有宽度*高度元素

auto pitch = this->width * 4;
std::cout << "fancy output: " << std::endl;
for(int y = 0; y < this->height; y++) {
    for(int x = 0; x < this->width; x++) {
        auto r = this->imageOutput[(y * pitch) + x * 4 + 0];
        auto g = this->imageOutput[(y * pitch) + x * 4 + 1];
        auto b = this->imageOutput[(y * pitch) + x * 4 + 2];
        auto a = this->imageOutput[(y * pitch) + x * 4 + 3];
        std::cout << r << ' ' << g << ' '<< b << ' ' << a << ';';
    }
    std::cout << '\n';
}
auto-pitch=this->width*4;
标准:曲线宽度;x++){
自动r=此->图像输出[(y*间距)+x*4+0];
自动g=此->图像输出[(y*节距)+x*4+1];
自动b=此->图像输出[(y*节距)+x*4+2];
自动a=此->图像输出[(y*节距)+x*4+3];

std::难道这是很多代码吗,你能标记出它不工作的地方吗?那将在内核执行部分循环打印“奇特的输出”。但我感觉可能是OpenGL渲染部分中GLTEXAGE2D中的格式。我希望在最后的文本中这是清楚的,对不起。@Apahdos整个OpenGL部分是完全不相关的。你基本上是想弄清楚为什么你的内核不影响image2d内容。编辑你的问题,只包括我与您面临的具体问题有关。哦,对了,我没有看到输出结果。谢谢!内核似乎已在我的平台上编译,但我稍后将在没有全局文件的情况下尝试它。我不知道如何理解行间距。但是谢谢!我会看看它!但是,在结束。我仍然能够使用image2d_t类型吗?当使用与cl::ImageGL的互操作性时,因此我不需要ClenqueueRadimage,我仍然具有与白色图像相同的效果(初始值)我确实误解了将row_pitch设置为0时会发生什么,因此似乎忽略了一个因子4。非常感谢您澄清这一点。但不幸的是,即使进行了更改,它的行为仍然完全相同。我感觉我的设备(NVIDIA GTX 960)似乎不支持image2d_t类型Nevermind!…device.getDeviceInfo()返回1。但不幸的是,这仍然没有解决问题。哇……我删除了uu全局,但从早期的测试中,我也只删除了u write。它仍然有黑色/白色纹理。只将u write_添加到image2d_t变量(并删除u全局)事实上,我做到了这一点。另外,在互操作性方面,我也有同样的行为。
__kernel void simple_kernel(__global __write_only image2d_t texture, float offset) { //offset is not used for testing
    int x = get_global_id(0);
    int y = get_global_id(1);

    int2 pixelPos = (int2)(x, y);
    float4 pixelColor = (float4)(0.5f, 0.0f, 0.0f, 1.0f);

    write_imagef(texture, pixelPos, pixelColor);
};
auto pitch = this->width * 4;
std::cout << "fancy output: " << std::endl;
for(int y = 0; y < this->height; y++) {
    for(int x = 0; x < this->width; x++) {
        auto r = this->imageOutput[(y * pitch) + x * 4 + 0];
        auto g = this->imageOutput[(y * pitch) + x * 4 + 1];
        auto b = this->imageOutput[(y * pitch) + x * 4 + 2];
        auto a = this->imageOutput[(y * pitch) + x * 4 + 3];
        std::cout << r << ' ' << g << ' '<< b << ' ' << a << ';';
    }
    std::cout << '\n';
}