2012-01-26 62 views
3

編輯:建議我將紋理目標更改爲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); 
} 

現在我要指派texImage2DGL針對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。

我該如何驗證紋理完整性,在那裏我只初始化紋理而不提供任何實際紋理內容?有任何想法嗎?

+2

矩形紋理一直以來GL 2.0核心功能,並可以運行的OpenCL有他們核心的任何卡。請停止使用該功能作爲擴展名(ARB後綴)。這不是你的問題,但它仍然是你不應該做的事情。 –

+1

我想知道爲什麼你使用矩形紋理。由於OpenGL-2常規紋理可能具有任意大小。 – datenwolf

+0

感謝您的評論,我使用矩形紋理類型,因爲我...從一個例子複製。所以我應該使用GL_TEXTURE_2D來代替? – rdoubleui

回答

4

我能解決,我無法創建一個Image2DGL問題。我是缺少指定一個4通道的內部格式用於的Texture2D:

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)。這似乎滿足了質地完整性的要求。

+0

非常感謝您的討論。我不能理解的是,爲什麼這行需要glBindTexture(GL_TEXTURE_2D,0);因爲一旦我們已經在第三線再次綁定爲什麼我們需要這樣做。從你的解決方案中看到的東西都在爲我工作......現在生成的OpenCL紋理將從那個tex紋理中獲得..請儘早重播 – Megharaj

+0

+1因爲它也解決了我的問題 –

相關問題