2016-10-26 3 views
3

При работе с буферами и вершинных атрибутов в OpenGL ES (3.0) и Objective-C Я используюКак использовать функцию glVertexAttribPointer в Swift 3?

glBufferData(GL_ARRAY_BUFFER, sizeof(attributes), attributes, GL_DYNAMIC_DRAW); 

загрузить некоторые данные вершин (атрибутов) в буфер, а затем

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, sizeof(VertexCoordinatesStruct)/sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), 0); 

glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, sizeof(TextureCoordinatesStruct)/sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), (void *)sizeof(VertexCoordinatesStruct)); 

к укажите вершинную память памяти в буфере для вершинного шейдера. Обратите внимание, как я произвел sizeof (OGLVertexCoordinates) на Void * во втором вызове glVertexAttribPointer. Это, если смещение в GL_ARRAY_BUFFER, на котором лежат данные TextureCoordinatesStruct.

И затем я пытаюсь реализовать такой же точный тип кода в Swift 3. Но функция glVertexAttribPointer принимает UnsafeRawPointer как последний параметр, а не void *.

И это проблема, которую я не могу решить: Я не могу создать UnsafeRawPointer с некоторым определенным значением (смещением памяти), как я могу в Objc.

Я изучил все Q/AI мог найти, но все они не подходят для моего случая или просто не работают в Swift 3.

ответ

6

Вы проверили шаблон игры OpenGL ES из Xcode?

(Испытано в Xcode 8.1 GM семян.)

В GameViewController.swift, вы можете найти это:

glEnableVertexAttribArray(GLuint(GLKVertexAttrib.position.rawValue)) 
    glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, BUFFER_OFFSET(0)) 
    glEnableVertexAttribArray(GLuint(GLKVertexAttrib.normal.rawValue)) 
    glVertexAttribPointer(GLuint(GLKVertexAttrib.normal.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 24, BUFFER_OFFSET(12)) 

И BUFFER_OFFSET(_:) (в Objective-C шаблон, это макрос) определяется как :

func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer { 
    return UnsafeRawPointer(bitPattern: i)! 
} 

К сожалению, это ошибка и вызывает сбой во время выполнения. Вы должны установить его:

func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer? { 
    return UnsafeRawPointer(bitPattern: i) 
} 

С этим BUFFER_OFFSET(_:) вы можете создать UnsafeRawPointer с некоторым определенным значением.

+0

Вот и все! UnsafeRawPointer (bitPattern: i) - именно то, что мне нужно. Спасибо! Я действительно видел этот инициализатор, но не понял, почему параметр называется bitPattern, поэтому я его не замечал :(Будет позже проверять эти ошибки во время выполнения. Я сообщу здесь, если найду/исправить любые проблемы –

+0

Не заметил любые сбои или другие проблемы. –

1

Хотя не чувствует себя очень правильно, во всяком случае, я делаю таким образом ...

let ptr = UnsafePointer<UInt8>(bitPattern: UInt(offsetInBytes)) 
glVertexAttribPointer(indx, size, type, GLboolean(GL_FALSE), stride, ptr) 

ptr становится nil если offsetInBytes == 0 потому что nil является представление указателя со значением 0 (= нулевой указатель) ... ИМО.

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