加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – OpenCL / OpenGL纹理互操作/窗口问题

发布时间:2020-12-16 07:16:47 所属栏目:百科 来源:网络整理
导读:为了提高渲染质量,我正在使用OpenCL 1.1中的多功能可分离缩减器进行编写. 基本图像(仅覆盖最终图像的一小部分)被渲染成一个非常大的帧缓冲区.然后,它的颜色附加纹理被下采样并通过OpenCL放入另一个纹理中.最后,渲染屏幕对齐的四边形以显示结果. 到目前为止的
为了提高渲染质量,我正在使用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)会产生所需的结果,但仅在第一帧中 – 动画中发生的更改根本不会显示.因为我没有错误(见下文)我假设内核运行每一帧,但源纹理内容保持不变(它没有,我也有该纹理的实时输出).

问题:每次帧缓冲的内容发生变化时,是否必须调用clCreateFromGLTexture2D()?

编辑我刚刚意识到:inputTexture仍然附加到帧缓冲对象的GL_COLOR_ATTACHMENT0 – 这可能是个问题吗? EndEdit中

即使在两个内核调用之间排队的屏障,运行kernel_instance_2(< otherParams>,tempTexture,outputTexture)也不会产生可见的结果.即outputTexture保持为空.

问题:我是否需要在两个内核调用之间释放并重新获取纹理对象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,waiting4 0 events )
clEnqueueBarrier()
clEnqueueReleaseGLObjects( count=3 )

如果任何调用产生了错误,它就会在输出中.

我遇到很多次的另一种情况是clEnqueueReleaseGLObjects()返回错误代码-9999,有人称之为“NVidia:非法读取或写入缓冲区”.

问题:如果任何组件超过1.0f并且存储格式是RGBA8,那么write_imagef()是否不会钳制颜色值?所以这实际上意味着必须写一个write_imagef(texture,(int2)coord,clamp(color,0.f,1.f)); …

非常感谢提前 – 这让我在近一周的时间里敲打了我的脑袋……

编辑
还有一些可能值得一提的信息:

我怎么能区分这两个实例?
在程序源中有两个不同的__kernel函数,它们具有不同的名称(separable_X和separable_Y),它们都具有调用separable()函数的相同主体.

如何在GL和CL之间同步?
? – 在调用clEnqueueAcquireGLObjects()之前,负责获取GL对象的函数发出glFinish()
? – 我等待使用cl_events完成clEnqueueReleaseGLObjects()(将来可能会改变)

解决方法

你在clEnqueueAcquireGLObjects之前使用glFinish是正确的,但是你也应该在clEnqueueReleaseGLObjects之后调用clFinish.请仔细阅读OpenCL 1.1规范的9.8.6.2节.

另外,对于你的其他问题:

Do I have to call clCreateFromGLTexture2D() every time the contents of the framebuffer changed?

不,您只需执行一次即可从OpenGL纹理创建OpenCL图像.这应该发生在使用它的循环之前.

Do I need to release and re-acquire the texture object tempTexture in between both kernel calls,so OpenCL sees the changes?

没有.一旦获得OpenCL,您可以根据需要在那里使用它.

could it be that write_imagef() does not clamp the color value if any component exceeds 1.0f and the storage format is RGBA8?

不,它完美无缺.我们一直在使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读