OpenGL计算着色器的快速和脏分析?

时间:2016-03-26 10:08:35

标签: opengl profiling openframeworks compute-shader

我有一个Marching Cubes的GPU实现,用于程序生成的isosurfaces作为BSc项目的一部分,在OpenFrameworks中使用OpenGL计算着色器实现。它运行,调试和以合适的帧速率工作,但我想看看我是否可以进一步优化它并消除任何潜在的瓶颈(特别是,那里有很多原子,我想找到如果这些减慢了很多)。

该算法使用6个链式计算着色器,其间存在内存障碍:

  1. 获取样本
  2. 获取表面立方体(原子计数器)
  3. 获取唯一顶点(原子计数器)
  4. 获取多边形索引(原子计数器)
  5. 获取最终顶点位置
  6. 获得表面法线(大量原子添加)
  7. 基本上我想知道的是算法在每个单独的着色器中花费了多长时间,但OpenGL的异步性质使得这很困难。我安装了强烈推荐的GDebugger,用于配置this implementation,它使用OpenCL进行计算,使用OpenGL进行渲染。不幸的是它打破了我的计划:-(独立的exe在Win7下工作正常,但试图在GDebugger中运行它会为每个着色器抛出这个:

    [ error ] ofShader: checkProgramLinkStatus(): program failed to link
    [ error ] ofShader: ofShader: program reports:
    Compute info
    ------------
    (0) : error C7006: no work group size specified
    

    所以我需要另一种分析方式。我考虑过做这样的事情:

    glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
    glMapNamedBuffer(someBufferIJustUsed);
    cout << ofGetElapsedTimef() << endl;
    glUnmapNamedBuffer(someBufferIJustUsed);
    

    希望这应该阻止,直到着色器完成写入缓冲区,并给我至少一个完成时间的球场图?但如果有人能指出这种方法存在严重缺陷或者知道更好的方法,请告诉我。

0 个答案:

没有答案