相关疑难解决方法(0)

在Swift中调用glDrawElements而在Objective-C中调用时,OpenGL EXC_BAD_ACCESS

我正在研究Ray Wenderlich 的OpenGL for iOS教程,试图将他的代码从Objective-C转换为Swift.

我是OpenGL和Swift的新手,并且相信我的问题与我如何翻译Objective-C有关.原因如下:

在我的swift文件中设置包含OpenGL内容的视图,在最后的逻辑步骤(调用glDrawElements)上,应用程序将因EXC_BAD_ACCESS警报而崩溃.但是,如果我将此部分代码移动到Objective-C文件,则应用程序将按预期工作.

Swift版本的代码:

var positionDataOffset: Int = 0
glVertexAttribPointer(self.positionSlot, 3 as GLint, GL_FLOAT.asUnsigned(), 
    GLboolean.convertFromIntegerLiteral(UInt8(GL_FALSE)), 
    VertexDataSource.sizeOfVertex(), &positionDataOffset)

var colorDataOffset = (sizeof(Float) * 3) as AnyObject
glVertexAttribPointer(self.positionSlot, 4 as GLint, GL_FLOAT.asUnsigned(), 
    GLboolean.convertFromIntegerLiteral(UInt8(GL_FALSE)), 
    VertexDataSource.sizeOfVertex(), VertexDataSource.vertexBufferOffset())

var vertexOffset: Int = 0
glDrawElements(GL_TRIANGLES.asUnsigned(), VertexDataSource.vertexCount(),
    GL_UNSIGNED_BYTE.asUnsigned(), &vertexOffset)
Run Code Online (Sandbox Code Playgroud)

这是Objective-C版本:

glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(color, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 
    (GLvoid*) (sizeof(float) * 3));

glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,Swift更加冗长......我和其他人一样都是新手.:)

另一个注意事项:在Swift版本中,您将看到对类的几个类方法的调用VertexDataSource.从本质上讲,我无法决定如何将Objective-C的某些部分转换为swift,因此决定(现在)在Objective-C中创建一个可以为Swift代码提供这些属性的小类.以下是Objective-C中的那些方法:

+ (GLint)sizeOfVertex {
    return sizeof(Vertex);
} …
Run Code Online (Sandbox Code Playgroud)

opengl-es objective-c ios swift

5
推荐指数
1
解决办法
1492
查看次数

标签 统计

ios ×1

objective-c ×1

opengl-es ×1

swift ×1