GL-CL-Interop:测试纹理完整性

Posted

技术标签:

【中文标题】GL-CL-Interop:测试纹理完整性【英文标题】:GL-CL-Interop: Test for texture completeness 【发布时间】:2012-02-19 16:01:00 【问题描述】:

编辑:按照建议,我将纹理目标更改为GL_TEXTURE_2D。所以初始化现在看起来像这样:

void initTexture( int width, int height )

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width,
            height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

因为它是GL_TEXTURE_2D,所以需要定义 mipmap。这应该如何反映在 OpenCL Image2D 的初始化上?

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

不过,我仍然收到CL_INVALID_GL_OBJECT。所以问题仍然是:如何在 OpenCL Image2D 初始化时检查纹理完整性?


以前的方法:

我正在使用 avcodec 解码视频文件。结果是AVFrame。我可以在GL_TEXTURE_RECTANGLE_ARB 上显示框架。

这是我的纹理初始化的摘录,在初始化 gl (glew) 上下文之后:

GLuint tex = 0;

void initTexture( int width, int height )

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tex);
    glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB8, width,
            height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);

现在我想将 tex 分配给 Image2DGL 以实现 OpenCL 和 OpenGL 之间的互操作。我使用的是 Nvidia Geforce 310M,Cuda Toolkit 4。OpenGL 版本是 3.3.0,GLX 版本是 1.4。

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

这会返回一个:

clCreateFromGLBuffer: -60 (CL_INVALID_GL_OBJECT)

这一切都发生在我开始渲染循环之前。之后我可以在纹理上显示视频帧。 OpenCL 上下文允许使用纹理目标 (GL_TEXTURE_RECTANGLE_ARB),因为启用了相应的 OpenGL 扩展 (GL_ARB_texture_rectangle)。

现在 OpenCL 1.1 规范中的错误描述是:

如果纹理不是类型匹配的 GL 纹理对象,则为 CL_INVALID_GL_OBJECT texture_target,如果未定义指定的纹理miplevel,或者如果宽度或高度 指定的 miplevel 为零。

我使用的是 GL_TEXTURE_RECTANGLE_ARB,所以没有 mipmapping(据我所知)。然而我发现的是Nvidia OpenCL implementation notes中的这句话:

如果在调用 clCreateFromGLTexture2D 或 根据纹理的 OpenGL 规则,clCreateFromGLTexture3D 不完整 完整性,则调用将在 errcode_ret 中返回 CL_INVALID_GL_OBJECT。

在我只初始化纹理而不提供任何实际纹理内容的状态下,如何验证纹理的完整性?有什么想法吗?

【问题讨论】:

自 GL 2.0 以来,矩形纹理一直是核心功能,任何可以运行 OpenCL 的卡都将它们作为核心。请停止将该功能用作扩展(ARB 后缀)。这不是你的问题,但它仍然是你不应该做的事情。 我想知道你为什么要使用矩形纹理。由于 OpenGL-2 常规纹理可能是任意大小。 感谢 cmets,我使用了矩形纹理类型,因为我......复制了一个示例。所以我应该改用 GL_TEXTURE_2D 吗? 您是如何创建 OpenCL 上下文的?向我们展示该代码。 上下文已以特定于操作系统的方式创建,似乎不是问题。今天早上我能够找出问题所在。 【参考方案1】:

我能够解决无法创建Image2DGL 的问题。我错过了为 texture2D 指定 4 通道内部格式:

void initTexture( int width, int height )

    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL );
    glBindTexture(GL_TEXTURE_2D, 0);

通过指定 GL_RGBA,我能够成功创建 Image2DGL(相当于clCreateFromGLTexture2D)。这似乎满足了纹理完整性的需求。

【讨论】:

非常感谢您的讨论。我无法理解的是为什么那条线需要 glBindTexture(GL_TEXTURE_2D, 0);因为一旦我们已经再次绑定到第三行,为什么我们需要这样做。从您的解决方案中,事情对我有用……现在生成的 OpenCL 纹理是否会从该 tex 纹理中生成……请尽早重播

以上是关于GL-CL-Interop:测试纹理完整性的主要内容,如果未能解决你的问题,请参考以下文章

设置 GL_RGBA16F 纹理格式时获取不完整的 FBO

如何将 .fbx 纹理完全导入 Unity

线条不会在具有完全黑色纹理的屏幕外帧缓冲区上渲染

旋转纹理时如何消除失真

未找到金属“纹理”

QPaint 到 QGLFramebufferObject 纹理上?