簡體   English   中英

OpenCL / OpenGL紋理互操作/窗口的問題

[英]Problems with OpenCL/OpenGL Texture interop / windows

為了提高渲染質量,我正在使用OpenCL 1.1中的多功能可分離縮減器進行編寫。

基本圖像(僅覆蓋最終圖像的一小部分)被渲染成一個非常大的幀緩沖區。 然后,它的顏色附加紋理被下采樣並通過OpenCL放入另一個紋理中。 最后,渲染屏幕對齊的四邊形以顯示結果。

到目前為止的想法。 我們有什么:

  • 降尺度內核的2個實例(它存儲交換坐標的結果(即(y,x))
  • inputTexture(rtt-framebuffer的顏色附件)
  • tempTexture,size:inputHeight x outputWidth,使用CL_MEM_READ_WRITE創建
  • outputTexture

運行kernel_instance_1( <otherParams>, inputTexture, tempTexture )會產生所需的結果, 但僅限於第一幀 - 動畫中發生的更改根本不會顯示。 因為我沒有錯誤(見下文)我假設內核運行每一幀,但源紋理內容保持不變(它沒有,我也有該紋理的實時輸出)。

Question:每次幀緩沖的內容發生變化時,是否必須調用clCreateFromGLTexture2D()?

編輯我剛剛意識到:inputTexture仍然附加到幀緩沖對象的GL_COLOR_ATTACHMENT0 - 這可能是個問題嗎? EndEdit中

運行kernel_instance_2( <otherParams>, tempTexture, outputTexture )不會產生可見的結果,即使在兩個內核調用之間排隊的屏障也是如此。 即outputTexture保持為空。

Question:我是否需要在兩個內核調用之間釋放並重新獲取紋理對象tempTexture ,以便OpenCL看到更改?

只是為了看看OpenCL調用了什么,產生了以下輸出:

clCreateKernel( separable_X )
clRetainMemObject( separable_X::convolution )
clCreateKernel( separable_Y )
clRetainMemObject( separable_Y::convolution )
clCreateFromGLTexture2D( separable_X::dst + separable_y::src, texID=24, usage=temporary (source and target) )
clCreateFromGLTexture2D( separable_Y::dst, texID=18, usage=target )
clCreateFromGLTexture2D( separable_X::src, texID=22, usage=source )
clRetainMemObject( separable_X::dst )
clRetainMemObject( separable_Y::src )
clRetainMemObject( separable_Y::dst )
clRetainMemObject( clearEmpty::dst )
clEnqueueAcquireGLObjects( count=3 )
clEnqueueBarrier()
clSetKernelArg( separable_X::convert )
clSetKernelArg( separable_X::offset )
clSetKernelArg( separable_X::convolution )
clSetKernelArg( separable_X::dst )
clSetKernelArg( separable_X::src )
clEnqueueNDRangeKernel( separable_X, (1440, 1080, 0), waiting4 0 events )
clSetKernelArg( separable_Y::convert )
clSetKernelArg( separable_Y::offset )
clEnqueueBarrier()
clSetKernelArg( separable_Y::convolution )
clSetKernelArg( separable_Y::dst )
clSetKernelArg( separable_Y::src )
clEnqueueNDRangeKernel( separable_Y, (540, 1440, 0), waiting4 0 events )
clEnqueueBarrier()
clEnqueueReleaseGLObjects( count=3 )

如果任何調用產生了錯誤,它就會在輸出中。

我遇到很多次的另一種情況是clEnqueueReleaseGLObjects()返回錯誤代碼-9999,有人稱之為“NVidia:非法讀取或寫入緩沖區”。

Question:如果任何組件超過1.0f並且存儲格式是RGBA8,那么write_imagef()是否不會鉗制顏色值? 所以這實際上意味着必須寫一個write_imagef( texture, (int2)coord, clamp( color, 0.f, 1.f ) ); ...

非常感謝提前 - 這讓我在近一周的時間里敲打了我的腦袋......

編輯可能值得一提的更多信息:

我怎么能區分這兩個實例?
在程序源中有兩個不同的__kernel函數,它們具有不同的名稱( separable_Xseparable_Y ),它們都具有調用separable()函數的相同主體。

如何在GL和CL之間同步?
- 在調用clEnqueueAcquireGLObjects()之前,負責獲取GL對象的函數發出glFinish() clEnqueueAcquireGLObjects()
- 我等待使用cl_events完成clEnqueueReleaseGLObjects() (將來可能會改變)

你在clEnqueueAcquireGLObjects之前使用glFinish是正確的,但是你應該在clEnqueueReleaseGLObjects之后調用clFinish。 請仔細閱讀OpenCL 1.1規范的9.8.6.2節。

另外,對於你的其他問題:

每次幀緩沖的內容發生變化時,我是否必須調用clCreateFromGLTexture2D()?

不,您只需執行一次即可從OpenGL紋理創建OpenCL圖像。 這應該發生在使用它的循環之前。

我是否需要在兩個內核調用之間釋放並重新獲取紋理對象tempTexture,以便OpenCL看到更改?

沒有。一旦獲得OpenCL,您可以根據需要在那里使用它。

可能是如果任何組件超過1.0f並且存儲格式是RGBA8,write_imagef()不會鉗制顏色值?

不,它完美無缺。 我們一直在使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM