編輯:建議我將紋理目標更改爲GL_TEXTURE_2D
。所以初始化,現在看起來像這樣:GL-CL-Interop:測試紋理完整性
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
,MIP貼圖需要定義。 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如果紋理不是GL紋理對象,其類型相匹配 texture_target,如果沒有定義的紋理指定的miplevel,或者如果寬度或指定的miplevel的高度 爲零。
我正在使用GL_TEXTURE_RECTANGLE_ARB,所以沒有mipmapping(據我所知)。但是我發現這種說法在Nvidia OpenCL implementation notes:
如果到clCreateFromGLTexture2D或 clCreateFromGLTexture3D調用指定的紋理對象是不完全的按照規則的OpenGL紋理 完整性則調用將在errcode_ret返回CL_INVALID_GL_OBJECT。
我該如何驗證紋理完整性,在那裏我只初始化紋理而不提供任何實際紋理內容?有任何想法嗎?
矩形紋理一直以來GL 2.0核心功能,並可以運行的OpenCL有他們核心的任何卡。請停止使用該功能作爲擴展名(ARB後綴)。這不是你的問題,但它仍然是你不應該做的事情。 –
我想知道爲什麼你使用矩形紋理。由於OpenGL-2常規紋理可能具有任意大小。 – datenwolf
感謝您的評論,我使用矩形紋理類型,因爲我...從一個例子複製。所以我應該使用GL_TEXTURE_2D來代替? – rdoubleui