2013-11-07 2 views
6

Я пытаюсь настроить GLFW3 для моего проекта OpenGL на Xcode 5 (Mac OSX 10.8.4). Я успешно установил и связал свой проект с GLFW3 без проблем. Я даже получил окно, успешно созданное с проектом, и я смог обнаружить входы мыши и клавиатуры с окном, поэтому я считаю, что я правильно подключил GLFW3 (или, по крайней мере, так казалось).Современный OpenGL с GLFW3 на Mac OSX 10.8.4 - отсутствует glGenVertexArrays() и glBindVertexArray()?

Однако проблема возникла, когда я попытался нарисовать объект. Это был фрагмент кода, где показал ошибку до: (?)

#include <GLFW/glfw3.h>  

void LoadObject() 
{ 
    glGenVertexArrays(1, &VAO_myObj); // ERROR : Use of undeclared identifier 'glGenVertexArrays' 
    glBindVertexArray(VAO_myObj);  // ERROR : Use of undeclared identifier 'glBindVertexArray' 


    glGenBuffers(1, &VBO_myObj);    // No error 
    glBindBuffer(GL_ARRAY_BUFFER, VBO_myObj); // No error 

    glBufferData(blah blah blah);  // No error 

    glEnableVertexAttribArray(0);  // No error 
    glVertexAttribPointer(blah);  // No error 


    glBindBuffer(GL_ARRAY_BUFFER, 0); // No error 
    glBindVertexArray(0);    // ERROR : Use of undeclared identifier 'glBindVertexArray' 
} 

Таким образом, это привело меня к мысли, что каким-то образом GLFW3 не удалось связать с этими функциями. Когда я напечатал «glGen ...» в Xcode, я видел только следующие 4 функции во всплывающем окне:

void glGenBuffers(GLsizei n, GLuint * buffers) 
GLuint glGenLists(GLsizei range) 
void glGenQueries(GLsizei n, GLuint * ids) 
void glGenTextures(GLsizei n, GLuint * textures) 

Таким образом, это было, скорее всего, что glGenVertexArrays() действительно отсутствует в библиотеке.

Аналогично для «glBind ...», когда я ввожу имя Xcode, только они появились на всплывающем окне:

void glBindAttribLocation(GLuint program, GLuint index, const GLchar * name) 
void glBindBuffer(GLenum target, GLuint buffer) 
void glBindTexture(GLenum target, GLuint texture) 

Нет, где я вижу glBindVertexArray() в списке.

Итак, кажется, что glGenVertexArrays() и glBindVertexArray() отсутствуют. Но как они могли пропустить такие важные функции? Поэтому, скорее всего, я сам что-то пропустил.

Мне просто интересно, столкнулся ли кто-нибудь с этой проблемой с GLFW3 с Xcode 5 раньше? Кстати, я не использую glew или другие средства поддержки OpenGL. Я использую только GLFW3.

Буду признателен за любую подсказку относительно этой проблемы.

На боковой ноте, какой инструмент (рядом с glfw) вы бы рекомендовали получить окно на Mac для современного (основанного на шейдере) проекта OpenGL?

Заранее благодарю вас за помощь.

+1

Звучит подозрительно, как вы включили '' вместо ''. Это касается OS X. –

+0

Я даже не включил . Согласно документации glfw, glfw включил для вас. Единственное, что включает в себя: #include , #include для чтения в шейдерах и #include для обработки строк. Вот и все. – TATN

+0

Вау, ты понял. Спасибо, Андон. Я решил # включить , и это сработало! Таким образом, GLFW3 должен был включать «gl3.h», но он не включал (вместо него «gl.h»). Не могли бы вы повторно отправить ответ в ответ, чтобы я мог его принять? Еще раз спасибо! – TATN

ответ

15

Чтобы использовать API-интерфейсы API OpenGL 3.2, вам необходимо включить <OpenGL/gl3.h> в OS X. Имейте в виде, что если включить оба <OpenGL/gl.h> и <OpenGL/gl3.h> вы можете получить предупреждение компилятора, это потому, что gl3.h преследует две целей:

  1. обеспечивает функцию, перечисления и определения типов для ядра OpenGL 3.2
  2. Устраняет устаревшие функции, Перечисление и определение типов, которые являются недопустимыми в ядре OpenGL 3,2


Они эффективно взаимоисключающие, собственно заголовок зависит от версии контекста вы используете:

  • MacOS X 10.7+: (OpenGL: 2.1)

    • #include <OpenGL/gl.h>


  • MacOS X 10.7+: (OpenGL: 3.2 ядро ​​)

    • #include <OpenGL/gl3.h>
+0

Да, вы получите предупреждение о компиляторе, но (в это время), так как GLFW3 автоматически включает в себя «gl.h», нет способа обойти его (не то, что я знаю), если вы решите пойти с GLFW3. – TATN

+0

СПАСИБО! Я часами бил головой об этом, пытаясь понять, почему мой экран был пустым. – JimDaniel

10

GLFW3 включает в себя <GL/gl.h> по умолчанию. Для того чтобы включить <GL/gl3.h>, вы должны придерживаться #define GLFW_INCLUDE_GLCOREARB где-то до #include <GLFW/glfw3.h>

На установке Mac OSX из GLFW3, используя самогон, то определить макрос перед включаемым будет использовать OpenGL/gl3.h. Это может быть увидеть в файле заголовка:

#if defined(__APPLE__) 
#if defined(GLFW_INCLUDE_GLCOREARB) 
    #include <OpenGL/gl3.h> 
    #if defined(GLFW_INCLUDE_GLEXT) 
    #include <OpenGL/gl3ext.h> 
    #endif 
... 

Определить варианты описаны в build guide для glfw3. Это также облегчает предупреждение компилятора.

+0

Это не будет особенно полезно для OS X, поскольку Apple не использует обычное соглашение ''. Их GL-инфраструктура называется OpenGL, и вы должны включить ''. –

+1

FYI, сегодня это определение на mac будет включать 'OpenGL/gl3.h', поэтому он определенно полезен на Mac сейчас (поскольку я просто решил проблему с этим, используя его). – jmq

Смежные вопросы