2014-12-19 5 views
6

Я пытаюсь нарисовать черную одну строку на GLKitView, используя Swift, но это не сработает. Я могу очистить экран, и я могу заполнить его любым цветом, но я ничего не могу на нем нарисовать. И я знаю, этот вопрос задавали много раз, но я не мог найти ответа на Свифт. Более того, нет никакой информации об использовании OpenGL ES с Swift, поэтому я пришел сюда.Swift - Как нарисовать линию в OpenGL ES?

Вот мой код:

import GLKit 

class MyGLKit: GLKView { 
    override func drawRect(rect: CGRect) { 
     glClearColor(0.8, 0.8, 0.8, 1.0) 
     glClear(GLbitfield(GL_COLOR_BUFFER_BIT)) 

     glColor4f(0, 0, 0, 1) 

     var line: [GLfloat] = [-1, 0, 1, 0] 
     var len = line.count * sizeof(GLfloat) 

     // Create an handle for a buffer object array 
     var bufferObjectNameArray: GLuint = 0 

     // Have OpenGL generate a buffer name and store it in the buffer object array 
     glGenBuffers(1, &bufferObjectNameArray); 

     // Bind the buffer object array to the GL_ARRAY_BUFFER target buffer 
     glBindBuffer(GLbitfield(GL_ARRAY_BUFFER), bufferObjectNameArray); 

     // Send the line data over to the target buffer in GPU RAM 
     glBufferData(
     GLbitfield(GL_ARRAY_BUFFER), // the target buffer 
     len,       // the number of bytes to put into the buffer 
     line,       // a pointer to the data being copied 
     GLbitfield(GL_STATIC_DRAW)); // the usage pattern of the data 

     glVertexPointer(2, GLbitfield(GL_FLOAT), 0, line); 
     var programHandle: GLuint = glCreateProgram() 
     glLinkProgram(programHandle) 

     glDrawArrays(GLbitfield(GL_LINES), 0, 2); 
    } 
} 

Я не уверен, что этот код делает, потому что OpenGL ES кажется безумно, после обычного OpenGL. Я имею в виду, вам нужно написать много кода, чтобы нарисовать одну строку. Почему это работает?

+0

Вам понадобится вызов 'glVertexPointer()', который вы закомментировали. Но используйте «0» в качестве последнего аргумента, так как это смещение в буфер, если буфер связан. –

+1

@RetoKoradi Я не могу использовать '0' в качестве последнего аргумента, потому что XCode говорит' Невозможно вызвать 'init' с помощью списка аргументов типа '(IntegerLiteralConvertible, $ T3, IntegerLiteralConvertible, IntegerLiteralConvertible)' '. Последний аргумент _ Указывает указатель на первую координату первой вершины в массиве_. Поэтому он должен быть указателем на первый элемент массива. Но как это сделать? –

+0

Я согласен с OP, OpenGL-ES с быстрым - 'безумный'. Я просто хочу провести чертову линию от точки А до точки Б. Почему, черт возьми, это требует 20+ строк кода gl? Почему это не примитив? +1 для 'insane' –

ответ

1

Я не использовал Swift, но на основе кода в OpenGL EXC_BAD_ACCESS when calling glDrawElements in Swift but not in Objective-C, ваш glVertexPointer() вызов должен выглядеть следующим образом:

let bufferOffset: CConstVoidPointer = COpaquePointer(UnsafePointer<Int>(0)) 
glVertexPointer(2, GLbitfield(GL_FLOAT), 0, bufferOffset); 

Это также выглядит, как вы на самом деле не строит программу шейдера:

var programHandle: GLuint = glCreateProgram() 
glLinkProgram(programHandle) 

Существует множество вещей, которые нужно пройти между вами, если вы используете простой OpenGL. Вам нужно создать объекты шейдеров, дать им код, написанный в GLSL, сделать вызовы для компиляции шейдеров и т. Д. Я считаю, что GLKit имеет функциональность для использования предварительно запеченных шейдеров.

Что касается того, почему OpenGL настолько «безумный», это выходит за рамки этого сайта. И очень субъективно. IMHO, главное, чтобы иметь в виду, что OpenGL не предназначен для использования в качестве удобного API для программистов. Он предназначен для обеспечения относительно тонкой общей абстракции для доступа к графическому оборудованию. И тенденция к сопоставимым API-интерфейсам заключается в том, чтобы сделать слой абстракции еще более тонким, чтобы уменьшить накладные расходы (см., Например, DirectX 12).

Ничего не мешает кому-либо реализовать более удобные API более высокого уровня поверх OpenGL. Эти интерфейсы существуют, и люди используют их.

+1

У меня есть ошибка« Использовать необъявленный тип »CConstVoidPointer''. Когда я изменил тип на 'UnsafePointer', он работал, но все равно ничего не рисуется. –

+0

Я бы предложил вам отредактировать ответ, но есть вероятность, что ваше редактирование будет отклонено, так как оно должно будет пройти через очередь просмотра редактирования. Помимо этого, похоже, что вам не хватает встроенной шейдерной программы. Я добавил абзац об этом. Извините, если мой ответ не очень полезен. Не уверен, что я должен удалить его. Обычно я не отвечаю на вопросы по темам, которые я не понимаю, включая Swift. –

+1

Я думаю, что ты прав. Это так сложно заставить его работать! И это не имеет смысла, потому что мне не нужна 3D-графика. Все, что я хочу - нарисовать примитивные линии и круги. Возможно, вы можете назвать несколько таких «более удобных API более высокого уровня поверх OpenGL_»? –

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