2014-06-09 3 views
1

OpenGL, glew 및 GLFW를 사용하여 프로젝트의 간단한 게임을 코딩합니다. 나는 이미 Assimp를 사용하는 3D 모델 임포터를 가지고 있으며 텍스쳐도 다루고 있습니다. OpenGL 배치 렌더 메쉬

나는 하나의 메쉬 방식 그리기 해요되어

glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[NORMAL_VB]); 
    glNormalPointer(GL_FLOAT, 0, NULL); 

    glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[TEXCOORD_VB]); 
    glTexCoordPointer(2, GL_FLOAT, 0, NULL); 

    glBindBuffer(GL_ARRAY_BUFFER, m_Buffers[POS_VB]); 
    glVertexPointer(3, GL_FLOAT, 0, NULL); 

    //Render the triangles 
    glDrawArrays(GL_TRIANGLES, 0, m_Entries[i].NumIndices); 

내 문제는 내가이 같은 메쉬를 사용하여 개체를 이동하는 백 렌더링하지만, 각각 다른 세계의 위치와 회전을 가지고 할 수있는 방법인가?

움직이는 엔티티가 수백 개있는 경우 각 프레임마다 동일한 메쉬가 수백 번 렌더링되므로 FPS가 떨어질 수 있습니다.

, BTW 난 그냥 간단한 glVertexPointer() 때문에

+3

이것이 바로 버텍스 쉐이더와 인스 턴싱이 필요한 것입니다. 문제는'glVertexPointer (...)'등을 사용하기 때문입니다. GL의 어떤 버전을 사용하고 있는지 전혀 알지 못합니다. 인스턴스화는 GL 3.1에서 핵심으로 승격되었지만이 코드는 GL 1.5와 같이 오래되었을 수 있습니다. 답변을 더 간단하게 작성하기 위해 사용하는 GL의 버전을 언급 할 수 있습니까? –

+0

@ AndonM.Coleman, 실제로 어떤 버전을 사용하고 있는지 모르겠지만 아마도 마지막 버전 일 것입니다. – andrepcg

+0

@ AndonM.Coleman, 저는 여전히 오래되고 쓸모없는 기능을 많이 사용하고 있습니다 – andrepcg

답변

2

를 그릴, 쉐이더를 사용하지 않는 (다른 gl<Foo>Pointer() 호출) OpenGL은 3에서 사용되지 않으며 이후, 난 당신이 현재의 OpenGL을 사용하지 않는 겠지 3+ 핵심 프로필.

잠재적으로 사용할 수있는 인스턴스화 된 렌더링 방법에는 확장을 통해 제공되는 두 가지 방법이 있습니다. ARB_Draw_InstancedARB_Instanced_Arrays. 특정 카드/드라이버에서 둘 중 하나, 둘 다 또는 둘 다 사용할 수 있습니다.

이미 사용하고있는 glDrawArrays 전화처럼 기본적으로 작동하지만, 또한 당신이 다음 행렬을 읽을 사용하거나 인스턴스마다 다른 무엇이든 할 수 쉐이더에서 사용하기위한 gl_InstanceId 정수 변수를 제공 glDrawArraysInstancedARB()을 제공 ARB_Draw_Instanced UBO, TBO 또는 인스턴스 별 데이터를 쉐이더로 가져 오는 데 사용하려는 다른 메커니즘에서 필요한 데이터. 이론적으로이 확장은 OpenGL 1.1 이전의 컨텍스트에서 사용할 수 있습니다.

ARB_Instanced_ArraysglVertexAttribDivisorARB()을 제공하므로 특정 정점 속성의 작동 방식을 수정할 수 있습니다. 버텍스 쉐이더에서 각 후속 버텍스는 일반적으로 첨부 된 버퍼에서 다음 속성 값을 가져옵니다. 따라서 첫 번째 정점은 버퍼에서 처음 지정된 위치를 가져오고 두 번째 정점은 두 번째 위치를 얻습니다. 이 함수를 사용하면 OpenGL에게 대신 정점에 따라가 아니라 인스턴스에 따라 셰이더에 제공되는 데이터를 전진 시키도록 지시 할 수 있습니다. 예를 들어 그릴 예정인 모든 인스턴스의 월드 위치를 포함하는 일반적인 꼭지점 특성을 만들고 인스턴스간에 해당 값만 업데이트하도록 OpenGL에 지시 할 수 있으므로 첫 번째 인스턴스의 모든 정점이 첫 번째 값을 가져옵니다. 두 번째 인스턴스의 모든 정점은 두 번째 값을 얻습니다. 셰이더의 관점에서 볼 때이 값은 유니폼이 아닌 정점 속성 인 것처럼 처리됩니다. 이론적으로이 확장은 OpenGL 2 이전의 컨텍스트에서 사용할 수 있습니다.

내 하드웨어에서는 OpenGL 2.1 컨텍스트에서이 방법을 사용할 수 없습니다 (이러한 확장 또는 관련 항목은 노출되지 않으므로) . 귀하의 컴퓨터는 내 것과 같을 수 있습니다. OpenGL 2.1 컨텍스트에서 인스턴스 렌더링을 수행 할 수 없습니다. 아니면 두 가지 방법을 모두 지원할 수도 있습니다. 아니면 단지 하나 또는 다른. 마찬가지로, 프로그램에 제공하는 다른 사용자는 자신의 컴퓨터가 다른 컴퓨터를 지원하는지 또는 둘 다 지원하는지 또는 둘 다 지원하지 않는지 알 수 있습니다. 확장 기능은 마치 호스트 컴퓨터가 지원하는 것과 상관없이 프로그램이 처리 할 수 ​​있어야합니다.

제 경우에는 지원되는 컴퓨터에 따라 별도의 구현을 다루는 대신 '확장형'형태로 사용할 수있는 OpenGL 3+ 컨텍스트로 전환하는 것이 쉬운 해결책이었습니다.

glDrawArraysInstanced() (위의 ARB 인터페이스의 비 확장 버전)은 OpenGL 3.1에서 핵심이되었으므로 모든 3.1 코어 프로필에 반드시 있어야합니다. 마찬가지로 glVertexAttribDivisor()이 OpenGL 3.3의 코어 프로파일에 추가되었으며 3.3 코어 프로파일마다 사용할 수 있습니다.

+0

왜 이것이 호기심 때문에 OpenGL 2.1이라고 생각합니까? 내가 본 유일한 사실은 Vertex Arrays (OpenGL 1.1)와 Buffer Objects (OpenGL 1.5)입니다. –

+0

은 심각한 MacOsX 편향 일 수 있습니다. 2.1은 좋은 10 년 동안의 초 기 기본값이었습니다. –

+0

흠, 사실. (그리고 다시 한번, 버텍스 배열을 사용하고 버퍼 객체가 지원되는지 여부를 확인한 * OpenGL 1.x 코드를 작성했습니다)이 경우 ARB_Instanced_Arrays가 OpenGL 1.1만큼 멀리까지 사용할 수 있다는 것을 추가합니다. 반면 ARB_Draw_Instanced (프로그래머블 쉐이더가 유용하기 때문에) OpenGL 2 이상이 필요합니다. –