簡體   English   中英

在OpenCL內核中使用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內核(所有glPushMatrixglEnable )中進行渲染,但是我認為這是不可能的。 有人有做這種事情的經驗嗎?

使用OpenGL進行渲染已經由GPU並行化了,您不必做任何其他事情,而不僅僅是進行OpenGL繪圖調用。 OpenGL實施將它們排入發送到GPU的批處理中,GPU將並行處理頂點和片段(因為這就是GPU的工作)。

當然,要真正釋放GPU的功能,您必須通過使用已棄用的,過時的,過時的,廢棄的即時模式來停止飢餓。 即不要使用glBegin,glVertex,glEnd。 使用“頂點緩沖區對象”中包含的“頂點數組”。

(全部披露:如果您使用顯示列表,則即使使用即時模式,也可以利用GPU並行化功能。但是,對於新程序,不建議這樣做。)

暫無
暫無

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

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