2011-12-23 2 views
2

한다고 가정 나는 다음과 같은 코드가 있습니다glMultMatrix/glLoadMatrix는 glRotatef 또는 glTranslatef보다 더 효율적입니까?

glRotatef(angle, 1.0f, 1.0f, 0.0f); 
glRotatef(angle, 0.0f, 1.0f, 0.0f); 
glRotatef(angle, 0.0f, 0.0f, 1.0f); 
glTranslatef(0.0f, 0.0f -5.0f); 

는 동일한 기능을 수행 glLoadMatrix 기능을 통해 자신의 사용자 정의 행렬을 사용하는 것보다이 덜 효율적인가요를?

또한 매트릭스를 곱하여 사용자 정의 선형 변환을 만들 때 곱해진 마지막 행렬이 첫 번째 변환이된다는 것을 알고 있습니다. 마찬가지로, 위의 코드를 사용하면이 경우입니까? 변환 될 것이고, Z 축에 대해 회전하고, y 축과 x 축 주위로 회전 할 것입니까?

답변

6

일반적으로 매트릭스를 직접 어셈블하고 glLoadMatrix 또는 glMultMatrix를 통해로드하면 프로그램이 더 빨리 실행됩니다. 물론 자신의 매트릭스 루틴에서 어리석은 실수를 저 지르지 않으면 성능을 망칠 수 있습니다.

이것은 glRotate glTranslate 등의 기능이 순수한 수학보다 훨씬 더 많기 때문입니다. 매트릭스 모드를 확인해야합니다. glRotate는 축이 단위 벡터 등으로 전달되지 않는 경우를 처리해야합니다.

하지만 프레임 당 10 번째 시간을 수행하지 않으면 손실 된 성능에 대해 걱정할 필요가 없습니다. 그것은 합쳐 지지만 그다지 중요하지 않습니다.

OpenGL 변환을 다루는 개인적인 방법은 코드에서 행렬을 빌드하고 glLoadMatrix를 통해 OpenGL에 업로드하는 것입니다. 이것은 곱셈의 순서를 뒤집는 것과 같은 많은 단축키를 할 수있게 해줍니다 (OpenGL이하는 방식보다 더 빨리 계산할 수 있습니다). 또한 렌더링 전에 경계 상자 검사를 원한다면 필요한 매트릭스에 즉시 액세스 할 수 있습니다. 는 OpenGL은 glRotate 및 사양에

3

따르면 |

코드가 이러한 방식으로 작성 말할 필요도없이

다른 그래픽 API에 또한 포트에 쉽게 (ES2, 다이렉트 X, 게임 - 콘솔은 ... OpenGL을 생각) glTranslate가 매개 변수를 사용하여 4x4 행렬을 생성하면 현재 행렬에 (glRotate 또는 glTranslate) 생성 행렬과 현재 행렬을 대체하는 곱을 곱합니다.

대략적으로 당신이 입대 한 코드에서 4 개의 매트릭스 곱셈을 가짐을 의미합니다! 그 중 4 개의 API 호출과 glRotate의 각도를 4x4 매트릭스로 변환하는 몇 가지 다른 계산이 있습니다.

glLoadMatrix를 사용하면 직접 변환 행렬을 생성해야합니다. 각도와 변환을 사용하면 변형 행렬을 생성하고 모든 것을 가속화하는보다 효율적인 방법이 있습니다.

2

동일한 기능을 수행하는 glLoadMatrix 함수를 통해 고유 한 사용자 정의 행렬을 사용하는 것보다 효율적이지 않습니까?

매우 그렇습니다. 그러나 변환 매트릭스의 설정이 병목 현상이 된 상황에 직면하면 근본적으로 잘못된 작업을 수행하게됩니다. 작성된 실시간 그래픽 프로그램에서 변환 행렬의 계산은 합계로 처리되는 매우 적은 양의 항목 만 만들어야합니다. 이 같은

glMatrixMode(GL_MODELVIEW) 
for q in quads: 
    glPushMatrix() 
    glTranslatef(q.x, q.y, q.z) 
    glBindTexture(GL_TEXTURE_2D, q.texture) 
    glBegin(GL_QUADS) 
    for v in [(0,0), (1,0), (1,1), (0,1)]: 
     glVertex2f(v[0], v[1] 
    glEnd() 
    glPopMatrix() 

코드가 매우 저조한 수행합니다

아주 나쁜 프로그램에 대한 예를

이 (의사) 같은 것을했다.먼저 각 쿼드에 대한 새로운 변환 매트릭스를 계산하는 데 엄청난 시간을 소비하고 각 쿼드에 대한 기본 배치를 다시 시작합니다. 텍스처 스위치는 캐시를 죽이고 마지막으로 즉각적인 모드를 사용합니다. 실제로 위의 코드는 하나의 예제에서 모든 OpenGL 안티 패턴 중 최악의 코드입니다.

렌더링 성능을 높이려면 가장 좋은 방법은 위의 예에서 볼 수있는 패턴을 피하는 것입니다.

1

이러한 행렬 함수는 드라이버에서 구현되므로 최적화 될 수 있습니다. 자신의 코드를 작성하고 원래 OpenGL 코드보다 성능이 좋은지 아닌지를 테스트하는 데 시간을 할애해야합니다.

반면에 "새로운"버전의 OpenGL에서는 이러한 모든 기능이 없어지고 더 이상 사용되지 않는 것으로 표시됩니다. 따라서 새로운 표준에서는 사용자 정의 수학 함수를 사용해야합니다 (코어 프로파일을 사용한다고 가정)

관련 문제