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:测试纹理完整性的主要内容,如果未能解决你的问题,请参考以下文章