2012-12-13 4 views
2

내 친구이자 저는 C++과 OpenGL을 사용하는 프로젝트에서 작업하고 있습니다. 우리는 "ModelObject"를위한 C++ 클래스를 만들었고 각 ModelObject는 멤버 변수로 GLuint vao를 가지고 있습니다. 그런 다음 ModelObject를 초기화하는 동안, 우리는glGenVertexArrays가 고유 한 va를 제공하지 않음

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

를 호출하고 초기화 함수의 끝에서 우리는 맥락에서 얻을 수

glBindVertexArray(0); 

를 호출합니다. 이제 2 개의 객체, 열차 및 큐브를 렌더링하려고합니다. 그의 머신 (Linux Mint)에서 그들은 둘 다 자신의 텍스처로 멋지게 렌더링하고 객체를 쿼리하여 그들의 va가 각각 1과 2를 반환합니다.

그러나 내 컴퓨터 (MacBook Pro)에서는 두 개체가 모두 큐브로 렌더링됩니다 (하나는 열차의 질감이 있고 다른 하나는 큐브의 질감 임). 그들의 va를 질의하는 것은 0과 0을 반환합니다.

실험으로 우리는 glGenVertexArrays에게 각 ModelObject에 5 개의 vaos를 생성하라고 말했습니다. 결과적으로리스트 0, 1, 918273, 8, 7 (또는 그와 비슷한 것)이 만들어졌고 두 모델 객체에 대해 동일한 목록이되었습니다.

그래서 내가 알 수있는 한 glGenVertexArrays는 a) 0을 유효한 주소로 사용하고 b) glDeleteVertexArray를 호출하지 않아도 각 호출마다 동일한 주소를 생성합니다. 왜 내 컴퓨터에서이 작업을 수행하고 그의 작업을 수행하지 않겠습니까? 어떻게 중지합니까?

+3

gen/bind VAO가 호출 된 후에'glGetError()'가 당신에게 무엇인가를 제공합니까? – genpfault

+0

glGetError()는 Google 검색에 따라 "잘못된 연산"인 1282를 반환합니다. – Nick

답변

4

GPU가 OpenGL 3.0을 지원합니까? glview은 엔트리 포인트 glGenVertexArrays에 대해 무엇을 말합니까? GPU/드라이버가 VAO를 지원하지 않을 수 있습니다.

+0

glxinfo에 OpenGL 버전 2.1이 있다고 나와 있습니다. 파트너 컴퓨터에 이전 버전이 있습니다. glview에서 glGenVertexArrays를 찾을 수 없습니다. – Nick

+0

OpenGL 2.1에서 - 대신 VBO를 사용할 수 있습니다. 그리고 당신의 파트너는 어떤 GPU를 가지고 있습니까? 그의 glxInfo는 무엇을보고합니까? 드라이버가 더 낮은 버전을보고하더라도 엔트리 포인트가 존재할 수도 있습니다. – Ani

+0

우리는 실제로 4 개의 VBO를 사용하여 데이터 (정점, 색상, 법선, UV)를 저장하고 있습니다. VBO가 GPO로 보내지도록 패키지 된 것처럼 보였습니다. 내 파트너의 하드웨어에 대한 세부 사항을 모르지만, 불행히도 오늘은 주위에 있지 않습니다. – Nick

3

iMac에서 동일한 문제가 발생했습니다. MacOS에서는 분명히 glGenVertexArrayAPPLE과 glBindVertexArrayAPPLE을 사용해야합니다. 통화를 교체하면 일관된 고유 한 VAO를 얻을 수 있습니다.

+0

OpenGL 3.0에 VAO가 도입 된 이후로 2.1 컨텍스트를 사용하는 경우라면 그럴 것입니다. 3.x 문맥을 사용하고 있다면,'glGenVertexArrays()'가 잘 동작 할 것이다. –

2

OpenGL 3.0에 도입 된 VAO는 3.0 이상을 지원하는 컨텍스트에서만 작동합니다.

Mac OS는 Core Profile 컨텍스트에서 OpenGL 3.x 및 4.x 만 지원합니다. 기본적으로 OpenGL 2.1을 지원하는 컨텍스트가 제공되며 더 이상 사용되지 않고 Core Profile에서 제거 된 모든 기존 기능이 제공됩니다. Mac OS는 이 아니며은 호환 프로필을 지원합니다. 3.0 및 이후 버전의 기능은 레거시 기능과 함께 사용할 수 있습니다.

핵심 프로필 컨텍스트를 만드는 방법은 사용하는 창 시스템 인터페이스에 따라 다릅니다.

  • GLUT와 (자체되지 않는 것으로 표시 만, 여전히 순간에 작동합니다) : 일반적인 사람의 두 glutInitDisplayMode()에 전달 된 플래그에 GLUT_3_2_CORE_PROFILE 추가 (자세한 내용은 Glut deprecation in Mac OSX 10.9, IDE: QT Creator 참조). 코코아와

  • , 픽셀 포맷이 속성/값 쌍을 추가하는 속성 : 당신은 코어 프로필 컨텍스트를 일단

    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core, 
    

glGenVertexArrays()glBindVertexArray()가 잘 작동합니다. 이것은 분명히 적어도 OpenGL 3.x를 지원할 수있는 기계가 필요합니다. 이 페이지의 표에는 각 시스템의 버전 ​​지원 목록이 나와 있습니다 : http://support.apple.com/kb/HT5942.