2010-06-27 4 views
4

OpenGL과 그래픽 프로그래밍을 처음 접해 보았습니다. 항상 주제에 관심이 있었기 때문에 이론에 기초를 두었습니다.OpenGL 초보자 - 장면에서 물체를 움직이는 가장 좋은 방법

내가하고 싶은 것은 일련의 물체가 움직이는 장면을 만드는 것입니다. 특히, 그들은 필드에서 로봇 축구 선수입니다. 객체는 다음과 같습니다

  • 조명, 필드 및 목표, 어떤이 변경되지 않는
  • 번역 및 회전하지만
  • 선수입니다 확장하지를 받게 될 것이다 단일 메쉬 인 공, 각 몸체 부분으로 구성되어 있으며 연결된 몸체의 환영을주기 위해 회전되어 있습니다.

내 초심자 GL에게는 이러한 객체를 장면에로드 한 다음 이동해야합니다. 약. 정점의 속성, 위치 지정이나 텍스처/법선/등은 변경되지 않습니다. 부모 개체의 변형.

플레이어는 모두 동일한 시체를 가지고 있습니다. 모델을 메모리에 한 번로드 한 다음 매번 다른 변형 행렬로 여러 번 그려서 어떻게 든 최적화 할 수 있습니까?

저는 현재 OpenGL 라이브러리 위에있는 경량 래퍼 인 OpenTK를 사용하고 있습니다.

그래서이 질문에 도움이 대답은 것 중 하나

  • OpenGL은 어떤 부분은 내가 원하는 걸 줄? 프레임마다 모든면을 다시 그려야합니까? 움직이는 사람들? 일부 변환 행렬을 업데이트 할 수 있습니까? OpenTK를 사용하면 얼마나 간단하게 만들 수 있습니까? psuedocode는 어떻게 생겼을까요? 또는
  • 무료 (이상적으로 오픈 소스)와이 추상화 수준을 제공하는 더 나은 프레임 워크가 있습니까?

.NET across multiple platforms에서 실행하는 솔루션이 필요합니다.

답변

5

소위 버텍스 배열을 사용하는 것이 아마도 그러한 장면을 최적화하는 가장 확실한 방법 일 것입니다. 여기 좋은 자습서는 다음과 같습니다

http://www.songho.ca/opengl/gl_vertexarray.html

정점 배열 또는 더 일반적으로 GL 데이터 배열은 정점의 위치, 법선, 색상 등의 데이터를 보유하고 있습니다. 또한 버퍼를 그리는 순서를 나타 내기 위해 이러한 버퍼에 대한 인덱스를 보유하는 배열을 가질 수 있습니다.
그런 다음이 배열을 관리하고, 할당하고, 데이터를 설정하고 페인트합니다. glDrawElements()

이러한 배열은 일반적으로 호스트 메모리에 있습니다. 일반 배열과 동일한 개념이지만 상주하는 버텍스 버퍼 객체를 사용하는 것이 좋습니다. GPU 메모리와 다소 빠른 수 있습니다. 여기에 대한 ABIT의 : 좋은 오래된 glBegin() .. glEnd() 반대는 OpenGL ES와 호환되는 장점을 가지고로

http://www.songho.ca/opengl/gl_vbo.html

은 버퍼 작업.OpenGL ES에서 배열과 버퍼가 물건을 그리는 유일한 방법입니다.

--- 편집

, 물건을 이동을 회전하는 장면에서 그들을 변화는 모델 뷰 행렬을 사용하여 수행하고 메쉬 데이터에 대한 변경을 필요로하지 않습니다. 설명하기 : 당신이 시작되기 때문에

void initGL() { 
    // create set of arrays to draw a player 
    // set data in them 
    // create set of arrays for ball 
    // set data in them 
} 

void drawScene { 
    glMatrixMode(GL_MODEL_VIEW); 
    glLoadIdentity(); 
    // set up view transformation 
    gluLookAt(...); 
    drawPlayingField(); 

    glPushMatrix(); 
    glTranslate(player 1 position); 
    drawPlayer(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glTranslate(player 2 position); 
    drawPlayer(); 
    glPopMatrix(); 

    glPushMatix(); 
    glTranslate(ball position); 
    glRotate(ball rotation); 
    drawBall(); 
    glPopMatrix(); 
} 
+0

그게 메쉬 그리기의 기본 메 커닉을 설명해 주지만, 그걸 움직이는 것은 (질문의 제목처럼)? 다른 변형이 적용된 한 프레임에서 동일한 메쉬를 여러 번 재사용 할 수 있습니까? VBO 또는 VA를 사용해야합니까? –

+0

새 편집 된 텍스트보기 – shoosh

+0

감사합니다. 이것은 좋은 것처럼 보이고 프레임 당 하나의 VBO를 여러 번 그리는 예비 버전을 가지고 있습니다. 조명이 잘 정리 될 필요가 있지만 매우 흥미로 웠습니다. 당신의 도움을 주셔서 감사합니다. –

4

, 내가 직접 모드 렌더링을 고수하고 처음 일을 점점 제안 :

을 당신은 당신의 초기화를해야합니다. 좀 더 편안 해지면 버텍스 배열을 개선 할 수 있습니다. VBO가 훨씬 편안 해지면. 그리고 마침내, 당신이 극한의 편안함을 얻는다면, 당신의 케이스를위한 가능한 가장 빠른 솔루션 인 인스 턴싱 (변형이없고 전체 객체 변형 만 가능).

Fifa 2009와 같은 것을 구현하지 않는 한, 효율성 문제가 발생할 때까지 간단한 방법을 고수하는 것이 가장 좋습니다. 조급하게 두통을 줄 필요가 없습니다.

전체 개체 변환의 경우 일반적으로 모델보기 행렬을 변형합니다.

glPushMatrix(); 
// do gl transforms here and render your object 
glPopMatrix(); 

로드 객체의 경우, 당신도 (obj가 지원하는 가장 쉬운 형식 중 하나입니다) 어떤 형식으로 마련 또는 메쉬 형식을로드 할 수있는 무언가를 구현해야합니다. 이 작업을 단순화하는 고급 라이브러리가 있지만 OpenGL을 사용하여 경험과 컨트롤을 제공하는 것이 좋습니다.

1

OpenGL API가 IDE 지원 (intellisense 등)을 통해 쉽게 탐색되기를 바랍니다. 몇 시간이 지난 후에 몇 가지 기본 원칙이 수립되어야한다는 것이 명백 해졌다. 그래서 나는 타이핑과 RTFM을 그만 두었다.

http://www.glprogramming.com/red/

최고의 조언 나는 그들의 OpenGL을 발판을 찾을 때이 질문을 발견 다른 사람에게 줄 수 있습니다. 오랫동안 읽었지만 힘을 실어주었습니다.

관련 문제