【问题标题】:Using OpenGL in OpenCL kernel在 OpenCL 内核中使用 OpenGL
【发布时间】:2014-01-29 07:20:24
【问题描述】:

在使用 OpenCL 内核时有什么方法可以使用 OpenGL 方法吗?我想使用 GPGPU 对基于体素的算法进行矢量化。给一个简单的例子粘贴我算法的当前代码,也许有人可以帮助我解决这个问题。

for(int x = 0; x < voxelWorld->getVoxelsX(); x++)
    for(int y = 0; y < voxelWorld->getVoxelsY(); y++)
        for(int z = 0; z < voxelWorld->getVoxelsZ(); z++)
        {
            glPushMatrix();
            glTranslatef((x - voxelWorld->offsetX())*voxelWorld->getVoxelSize(),
                         (y - voxelWorld->offsetY())*voxelWorld->getVoxelSize(),
                         (z - voxelWorld->offsetZ())*voxelWorld->getVoxelSize());
            if(this->doRenderWireframeWorld)
            {
                glDisable(GL_LIGHTING);
                glColor3f(1.0f, 1.0f, 1.0f);
                this->renderVoxel(false);
                glEnable(GL_LIGHTING);
            }

            if(voxelWorld->getVoxel(x, y, z) && this->doRenderVoxels)
            {
                glColor3f(0.0f, 1.0f, 0.0f);
                this->renderVoxel(true);
            }
            glPopMatrix();
        } 

我知道应该只有一个循环而不是三个嵌套循环。所以我会把代码稍微改一下:

for(int i = 0; i &lt; voxelWorld-&gt;getVoxelsX() * voxelWorld-&gt;getVoxelsY() * voxelWorld-&gt;getVoxelsZ(); i++)

将数据传递给 OpenCL 内核是一个好的开始,但现在呢?我想在 OpenCL 内核中进行渲染(所有 glPushMatrixglEnable),但我认为这是不可能的。有没有人有做这种事情的经验?

【问题讨论】:

  • 使用现代 OpenGL 将其并行化,特别是使用每个顶点数据和变换代替全局矩阵堆栈的着色器。
  • 那么优化渲染的时候没有OpenCL的地方?
  • 您可以混合使用这两者,其中缓冲区在 OpenGL 和 OpenCL 之间共享,但对于上面的示例,我也会按照 delnan 的建议坚持使用 OpenGL 顶点着色器。
  • @PawełJastrzębski 好吧,您可以在 OpenCL 中编写自己的软件渲染器,但除非您的渲染器严重偏离光栅化,否则它是没有用的。 OpenGL 以更方便的方式提供对相同的硬件资源的访问。
  • @PawełJastrzębski 如果只有体素,光线追踪算法可以足够快,并在 opencl 上计算一些加速结构。

标签: c++ multithreading opengl opencl


【解决方案1】:

使用 OpenGL 进行渲染已经被 GPU 并行化了,您无需做任何进一步的事情,只需进行 OpenGL 绘图调用即可。 OpenGL 实现将它们分批发送到 GPU,GPU 将并行处理顶点和片段(因为这就是 GPU 所做的)。

当然,要真正释放 GPU 的强大功能,您必须停止使用已弃用、老式、过时、废弃的即时模式来阻止它。 IE。不要使用 glBegin、glVertex、glEnd。使用顶点缓冲区对象中包含的顶点数组。

(完全披露:如果您使用显示列表,即使使用立即模式也可以利用 GPU 的并行化能力。但不建议在新程序中使用。)

【讨论】:

  • 那么VBO方式是并行渲染方式吗?实例化有什么用?
  • 仅在 TMU/ROP 上并行化?没有计算核心?
  • @PawełJastrzębski:不,VBO 与并行化无关。 GPU 将始终并行化渲染过程。 VBO 的目的是将 GPU 渲染图片的数据放在 GPU 可以快速访问的内存中。立即模式以非常小的块的形式提供 GPU 渲染命令。在您的程序能够发送下一个glVertex 命令之前,GPU 将完成将像素(并行)渲染到帧缓冲区。简而言之:即时模式正在耗尽 GPU。
  • CPU 多线程渲染将附带 mantle。但不适用于 opengl 对吧?
  • @huseyintugrulbuyukisik:现代 GPU(2008 年之后制造的所有产品)在它们之间没有区别。相同的着色器核心用于顶点设置、几何着色器、片段着色器和一般计算。例如,当您渲染覆盖帧缓冲区某些区域的三角形时,片段操作将并行执行。
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 2012-11-02
  • 2011-12-06
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多