2013-01-15 2 views
3

OpenGL에서 성능 문제가 발생했습니다. 본질적으로 사각형 격자를 만들고 싶습니다. 먼저 각 사각형을 정사각형이 원하는 위치로 변환 한 다음 모델과 매트릭스를 곱하고이를 셰이더 프로그램에 전달하고 사각형을 그리는 위치에서 구현하려고했습니다. 각 사각형에 대해 이렇게 할 것입니다. 약 50 개의 사각형을 생성 한 후에는 프레임 속도가 원하는 것보다 떨어지기 시작할 것입니다.OpenGL 2.0 ES 행렬 스택은 어떻게 작동합니까?

그런 다음 사각형이 위치를 변경할 때마다 기본적으로 정점 버퍼를 생성하는 VBO 방법을 시도했습니다. 이 방법을 사용하면 프레임 속도가 크게 증가했지만, 모든 정점 위치를 다시 생성해야하기 때문에 무언가가 변경되면 너무 많은 대기 시간이 발생합니다.

내가 필요로하는 것은 매트릭스 스택이다. 나는 이전에 opengl 1.1을 사용했고 push/pop을 사용했다. 나는 그것이하고있는 일과 그것을 재현하는 법의 개념을 정말로 이해하지 못한다. 누구든지 매트릭스 스택의 좋은 예를 어디에 사용할 수 있는지 알고 있습니까? 아니면 하나에 대한 좋은 설명일까요?

답변

2

기본적으로 달성하고자하는 것과 동일하지만 사각형 대신 큐브를 사용하여이 튜토리얼을 확인할 수 있습니다. 그것은뿐만 아니라 VBO를 사용 행렬에 대해

http://www.learnopengles.com/android-lesson-seven-an-introduction-to-vertex-buffer-objects-vbos/

을, OpenGL을 ES 2.0하지 (더 이상 어떤 매트릭스 관련 기능을 가지고 있지만, 같은 않는 glmath 라이브러리를 사용할 수 있으며 많은에) 더 : 당신은 그냥 어딘가에 복사해야하고 당신이 그것을 필요로하는 곳에 그것을 포함 있도록

http://glm.g-truc.net/

그것은, 헤더 라이브러리입니다.

당신의 목표를 완전히 이해할 수 있을지 모르겠지만 VBO를 사용하여 그래픽 카드에있는 한 사각형의 데이터를 복사 한 다음 모든 사각형에 대해 모델 행렬을 반복적으로 업데이트 할 수 있다고 생각합니다.

네모 난 사각형이 그들 사이에 어떤 종류의 계층 구조를 가지고 있다면 (예를 들어, 그들 중 하나가 움직이면 그에 따라 왼쪽으로 움직이는) 매트릭스 스택의 개념이 적합합니다.

사각형으로 만들어진 해골이라고 상상해보십시오. 어깨가 움직이면 팔의 모든 조각 (손, 손가락 등)도 움직입니다. 매트릭스 스택을 사용하여 에뮬레이트 할 수 있습니다. 모든 사각형이 모든 자손과 함께 어떤 종류의 나무를 만들 수 있으므로 모든 사각형에 "자손"목록이있어 부모와 같은 변형이 적용됩니다.당신은 모든 사각형처럼 반복적으로 렌더링 할 수 있습니다

  1. 이 같은 모든 자녀를위한 기능을 렌더링
  2. 전화 큐에서 변형 루트 광장 (들)
  3. 를 눌러 변환을 적용
  4. 모든 아이가 큐의 상단에있는 매트릭스를 읽고, 자신의 변환에 의해 에게 그것을 곱, 큐에 새로운 매트릭스를 밀어 는 그 후 아이들에게
  5. 를 호출하는 모든 어린이들은
  6. 전에 밀어 행렬을 튀어 모든 어린이를위한

    std::vector<glm::mat4> matrixStack; 
    

    그리고 : 행렬의 (이 경우 벡터 표준)

    glm::mat4 modelMatrix = matrixStack.back(); 
    glm::mat4 nodeTransform = /*apply your transform here*/ 
    glm::mat4 new = modelMatrix * nodeTransform; 
    matrixStack.push_back(new); 
    /*Pass in the new matrix to the shader and call to glDrawArrays or whatever to render your square*/ 
    
    for (every child) { 
        render(); 
    } 
    matrixStack.pop_back(); 
    

    glmath, 당신은 단지 큐를 생성하는 것은 매우 쉬운 필요가있다 사용

드로잉 부분에서는 사각형 정점으로 정점 배열을 바인딩 한 다음 glDrawArrays를 호출하기 전에 모든 자식에 대한 셰이더에서 모델 행렬을 업데이트 할 수 있다고 생각합니다.

+0

이것은 기본적으로 내가 시도한 것입니다. 그들은 실제로 정점 버퍼에서 모든 것을합니다. 실제로 번역을 통해 각 큐브를 배치하지는 않습니다. –

+0

프레임 당 여러 번역을 수행하는 예제가 필요합니다. 나는 AndEngine을 찢어 버리려고했는데, 왜냐하면 그것들을하고 있기 때문이다. 그러나 내가 익숙하지 않은 추상화와 OpenGL 레이어는 나를 위해 너무 많이있다. 그들은 매트릭스 푸시/팝 구현을 거기에, 나는 단지 그것이 실제로 무엇을하는지 이해하지 않습니다. –

+0

@seanwagner 일부 의사 코드 – Esparver