2010-05-16 2 views
3

나는 지형을 끌어 들이고 물이 흐르는 곳을 (저렴하고 쉬운 방법으로) 시뮬레이트하는 프로그램을 가지고있다.OpenGL 모델을 병렬로 빌드 하시겠습니까?

OpenMP를 사용하여 물을 업데이트하는 것은 쉬운 일 이었으므로 초당 ~ 50 회의 업데이트가 가능합니다. 문제는 소량의 물이 있더라도 1 초당 내 드로우가 매우 낮습니다 (5에서 시작하여 상당한 양의 물이 있으면 약 2로 떨어집니다).

지형이 복잡하고 너무 빨리 그려지기 때문에 비디오 카드에는 문제가 없습니다. boost::timer은 물을 끄면 초당 무한대로 그려진다는 것을 알려줍니다. 메모리 대역폭과 관련이있을 수 있습니다. (모델이 카드에 남아 있고 매번 전송할 필요가 없다고 가정하기 때문에).

내가 걱정하는 것은 각 무승부 때마다 glVertex3f() (최대 크기는 450 * 600, 각 4 정점)입니다. Glut이 나를 허용하지 않기 때문에 순차적으로 완료됩니다. 무엇이든 병렬로 부르십시오.

그래서 .. 병렬로 목록을 작성한 다음 한꺼번에 OpenGL에 전달하는 방법이 있다면? 또는 다른 방법으로 더 빨리 그릴 수 있습니까? 내가 잘못된 방법을 사용하고 있습니까? (명백한 "적은 버텍스 사용"외에)?

답변

8

병렬로 그리기에 대한 사용자의 접근 방식은 사용자가해야하는 것과 정확히 반대입니다. 그래픽 하드웨어는 본질적으로 병렬이며 매우 짧은 시간에 최대한 많은 호출을 시도하는 데별로 사용하지 않습니다. 병렬 처리가 발생할 수있는 하드웨어에 데이터를 보내는 단일 거대한 전화를하는 것이 중요합니다. 모든 glVertex() 통화는 정확히 반대입니다.

게오르그는 지적 : 사람들은 충분히 당신이 버텍스 버퍼 오브젝트까지 단계를해야하지 않을 경우 glVertexPointer()glDrawElements() 또는 glDrawArrays()와 함께, 당신의 상황에 적합하다. 또 다른 방법은 셰이더를 사용하여 계산을 GPU에 직접 수행하는 것입니다. 이러한 모든 방법을 통해 GPU에서 거의 무료로 마비를 느낄 수 있습니다.

+0

이것은 정확하게 내가 찾고있는 것 같습니다. 감사. –

7

은 내가 대해 걱정하는 것은 모든 무승부에, 나는 glVertexPointer()에서 봐 시간

)을 (glVertex3f를 호출 만 약 해요 있다는 것입니다.

4

glVertexPointer 외에도 대부분의 최신 하드웨어에서 지원되는 ARB_vertex_buffer_object을보고 어떤 경우에는 정점 배열보다 빠를 수도 있습니다.

+0

또한 OGL 3.0 호환. 이것은 가장 현대적인 솔루션입니다. –

+0

정말 흥미로운 것 같습니다. 이전 하드웨어와의 호환성에 대해서는 잘 모르기 때문에 아마도 다른 솔루션을 사용할 것입니다.하지만 이것은 흥미로운 것으로 들립니다. –

+1

NVIDIA 및 ATI의 확장 레지스트리를 확인하십시오. 언제 도입되었는지 알 수 있습니다. 실제로는 적어도 5 년 전의 상당히 오래된 기능입니다. 나는 또한 모든 OpenGL ES 2.0 타겟에서도 지원되는 것으로 생각합니다. – greyfade

2

glVertex()는 매우 비효율적입니다. glVertex()를 사용하여 단일 텍스처 쿼드 (2D 이미지)를 그리지도 않습니다.

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(3,GL_FLOAT,0,vertCoords); 
glClientActiveTextureARB(GL_TEXTURE0_ARB); 
glTexCoordPointer(2,GL_FLOAT,0,texCoords); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT,0,vertNorm); 
glDrawElements(drawtype,tCount*3,GL_UNSIGNED_INT,tris); 

또 다른 방법은 VBO의를 사용하는 것입니다하지만 그건 또 다른 이야기 :
대신 여기보다 쉽게 ​​할 몇 가지 코드입니다.
프로젝트에 도움이되기를 바랍니다. 더 이상의 질문이 있으면 부탁하십시오. OpenGL에 대해 기꺼이 대답하겠습니다.

관련 문제