【发布时间】: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 < voxelWorld->getVoxelsX() * voxelWorld->getVoxelsY() * voxelWorld->getVoxelsZ(); i++)
将数据传递给 OpenCL 内核是一个好的开始,但现在呢?我想在 OpenCL 内核中进行渲染(所有 glPushMatrix、glEnable),但我认为这是不可能的。有没有人有做这种事情的经验?
【问题讨论】:
-
使用现代 OpenGL 将其并行化,特别是使用每个顶点数据和变换代替全局矩阵堆栈的着色器。
-
那么优化渲染的时候没有OpenCL的地方?
-
您可以混合使用这两者,其中缓冲区在 OpenGL 和 OpenCL 之间共享,但对于上面的示例,我也会按照 delnan 的建议坚持使用 OpenGL 顶点着色器。
-
@PawełJastrzębski 好吧,您可以在 OpenCL 中编写自己的软件渲染器,但除非您的渲染器严重偏离光栅化,否则它是没有用的。 OpenGL 以更方便的方式提供对相同的硬件资源的访问。
-
@PawełJastrzębski 如果只有体素,光线追踪算法可以足够快,并在 opencl 上计算一些加速结构。
标签: c++ multithreading opengl opencl