2014-01-28 5 views
1

OpenCL 커널을 사용할 때 OpenGL 메서드를 사용할 수있는 방법이 있습니까? GPGPU를 사용하여 보셀 기반 알고리즘을 벡터화하고 싶습니다. 간단한 알고리즘을 붙여서 내 알고리즘의 코드를 붙이면 누군가가이 문제를 해결할 수 있습니다.OpenCL 커널에서 OpenGL 사용

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(); 
     } 

3 개의 중첩 루프 대신 하나의 루프 만 있어야한다는 것을 알고 있습니다. 지금의

for(int i = 0; i < voxelWorld->getVoxelsX() * voxelWorld->getVoxelsY() * voxelWorld->getVoxelsZ(); i++)

이의 OpenCL 커널로 데이터를 전달할 수있는 좋은 시작이 될 것입니다,하지만 : 그래서에 코드를 조금 변경해 것? 나는 OpenCL 커널 (모두 glPushMatrix, glEnable) 안에서 rendeing을하고 싶다. 그러나 나는 그것이 불가능하다고 생각한다. 아무도 그러한 일을하는 데 어떤 경험이 있습니까?

+1

특히, 현대의 OpenGL을 사용하여 병렬 처리 전역 매트릭스 스택 대신 정점 별 데이터 및 변환을 사용하는 셰이더. – delnan

+0

렌더링을 최적화 할 때 OpenCL을 사용할 수있는 공간이 없습니까? –

+0

OpenGL과 OpenCL간에 버퍼가 공유되는 두 가지를 혼합 할 수 있지만 위의 예에서는 delnan에서 제안한대로 OpenGL 버텍스 쉐이더를 사용합니다. –

답변

2

OpenGL을 사용한 렌더링이 GPU에 의해 이미 병렬화되어 있기 때문에 OpenGL 그리기 호출을 수행하는 것 이상의 작업을 수행 할 필요가 없습니다. OpenGL 구현은이를 GPU에 전송 된 배치로 대기열에 넣습니다. GPU는 정점과 단편을 병렬로 처리합니다 (GPU의 기능이기 때문에).

물론 GPU의 힘을 실제로 발휘하려면 더 이상 사용되지 않는 구식 오래된 구식 직접 모드를 사용하여 굶주 리지 않게해야합니다. 나는. glBegin, glVertex, glEnd를 사용하지 마십시오. 버텍스 버퍼 객체에 포함 된 버텍스 배열을 사용하십시오.

(전체 공개 :.. 당신은 디스플레이리스트를 사용하는 거라고 경우에도 즉시 모드를 사용하여 GPU의 병렬 처리 능력을 활용할 수 그러나이 새로운 프로그램을 사용하지 않는 것이 좋습니다)

+0

VBO 방식은 병렬 처리 방식입니까? 인스 턴싱은 무엇입니까? –

+0

TMU/ROP에서만 병렬화 되었습니까? 컴퓨팅 코어가 없습니까? –

+1

@ PawełJastrzębski : 아니요, VBO는 병렬 처리와 아무 관련이 없습니다. GPU는 ** 항상 ** 렌더링 프로세스를 병렬화합니다. VBO의 목적은 GPU가 빠르게 액세스 할 수있는 메모리에 GPU가 그림을 렌더링하는 데이터를 배치하는 것입니다. 직접 모드는 GPU 렌더링 명령을 아주 작은 단위로 제공합니다. 프로그램이 다음'glVertex' 명령을 보낼 수 있기 훨씬 전에 GPU는 픽셀을 (병렬로) 픽셀 버퍼에 렌더링합니다. 간단히 말해서 : 즉각적인 모드는 GPU를 굶주리고 있습니다. – datenwolf

관련 문제