gpt4 book ai didi

opengl - GL-CL-互操作 : Test for texture completeness

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

编辑:按照建议,我将纹理目标更改为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。这应该如何反射(reflect)在 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 规范中的错误描述如下:

CL_INVALID_GL_OBJECT if texture is not a GL texture object whose type matches texture_target, if the specified miplevel of texture is not defined, or if the width or height of the specified miplevel is zero.

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

If the texture object specified in a call to clCreateFromGLTexture2D or clCreateFromGLTexture3D is incomplete as per OpenGL rules on texture completeness then the call will return CL_INVALID_GL_OBJECT in errcode_ret.

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

最佳答案

我能够解决无法创建 Image2DGL 的问题。我缺少为 2D 纹理指定 4 channel 内部格式:

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)。看来这满足了纹理完整性的要求。

关于opengl - GL-CL-互操作 : Test for texture completeness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020167/

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