![](/img/trans.png)
[英]How do we display pixel data calculated in an OpenCL kernel to the screen using OpenGL?
[英]Using OpenGL in OpenCL kernel
使用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進行渲染已經由GPU並行化了,您不必做任何其他事情,而不僅僅是進行OpenGL繪圖調用。 OpenGL實施將它們排入發送到GPU的批處理中,GPU將並行處理頂點和片段(因為這就是GPU的工作)。
當然,要真正釋放GPU的功能,您必須通過使用已棄用的,過時的,過時的,廢棄的即時模式來停止飢餓。 即不要使用glBegin,glVertex,glEnd。 使用“頂點緩沖區對象”中包含的“頂點數組”。
(全部披露:如果您使用顯示列表,則即使使用即時模式,也可以利用GPU並行化功能。但是,對於新程序,不建議這樣做。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.