2014-12-02 3 views
0

Я пытаюсь запустить простую программу OpenGL, но я не могу ее отобразить. Я использую Swift на Mac, с которым я не знаком, хотя у меня есть хороший опыт работы с OpenGL на окнах. Программа не работает нормально (без ошибок GL или что-нибудь), но ничего не отображается, пока я не добавить это в конце моей инициализации OPENGL:Vertex Array Objcects - glGenVertexArrays GL_INVALID_OPERATION на OSX

var vao:GLuint=0;checkGlError(); 
glGenVertexArrays(1, &vao);checkGlError(); 
glBindVertexArray(vao);checkGlError(); 

Затем он дает GL_INVALID_OPERATION как только я называю glGenVertexArrays(), однако в документах это не упоминается как опция.

Я опасался, что у меня может не быть контекста GL3 (и действительно, я бы предпочел просто иметь контекст GL1/2, однако в заголовках Swift, похоже, отсутствуют такие вещи, как glBegin() и glColor3f(), поэтому я решил обосноваться на GL3), поэтому я попытался вручную запросить:

required init?(coder: NSCoder) { 
    super.init(coder: coder); 
    let attribs=[NSOpenGLPFAOpenGLProfile,NSOpenGLProfileVersion3_2Core,0]; 
    pixelFormat=NSOpenGLPixelFormat(attributes: UnsafePointer<NSOpenGLPixelFormatAttribute>(attribs)); 
    openGLContext=NSOpenGLContext(format: pixelFormat, shareContext: nil); 
    openGLContext.view=self; 
    openGLContext.makeCurrentContext(); 
}; 

Однако это, похоже, не влияет на вещи вообще.

+0

Кстати, если вам не хватает прототипов для таких вещей, как 'glBegin (...)', вы должны добавить '#include ' в свой код. Похоже, что включен только '', а заголовок * that * не включает функции из старого OpenGL. Весь этот бизнес «OpenGL/...» специфичен для Apple, поэтому оберните это чем-то вроде '#ifdef __APPLE__' ...' # endif'. –

+0

@ AndonM.Coleman это Swift не Obj-C, поэтому я не могу использовать #includes – zacaj

ответ

3

Во-первых, glBegin (...) недействителен в контексте основного профиля. Для этого вам понадобится исходный (неосновный) контекст.

Теперь, поскольку устаревший контекст ограничен OpenGL 2.1, он предлагает только GL_APPLE_vertex_array_object. В контексте 2.1 вы можете позвонить glGenVertexArraysAPPLE (...) и glBindVertexArrayAPPLE (...), и они сделают то же самое.

Проблема, с которой вы сталкиваетесь, заключается в том, что на OS X вы ссылаетесь на одну и ту же структуру независимо от той версии контекста, которую вы получаете. Это означает, что вы можете вызывать функции, которые не поддерживаются вашим контекстом во время выполнения. Каждый раз, когда вы пытаетесь использовать функцию GL 3.2+ из устаревшего контекста, вы получаете GL_INVALID_OPERATION.

0

Я смог решить это, создав заголовок моста и включив в него #include, а затем используя контекст GL1.

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