【发布时间】: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 上下文的?向我们展示该代码。
-
上下文已以特定于操作系统的方式创建,似乎不是问题。今天早上我能够找出问题所在。