Pav*_*tov 3 opengl-es ios swift3
在OpenGL ES(3.0)和Objective-C中使用缓冲区和顶点属性时,我使用
glBufferData(GL_ARRAY_BUFFER, sizeof(attributes), attributes, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
将一些顶点数据(属性)加载到缓冲区中,然后
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));
Run Code Online (Sandbox Code Playgroud)
在缓冲区中为顶点着色器指定顶点数据内存布局.注意我是如何在第二次glVertexAttribPointer调用中将sizeof(OGLVertexCoordinates)转换为Void*.这是在TextureCoordinatesStruct数据所在的GL_ARRAY_BUFFER中的偏移量.
然后我试图在Swift 3中实现相同类型的代码.但glVertexAttribPointer函数将UnsafeRawPointer作为最后一个参数,而不是void*.
这是我无法解决的问题:我无法在Objc中创建具有某些特定值(内存偏移)的UnsafeRawPointer.
我已经研究过所有Q/AI都可以找到的,但是它们都不适合我的情况,或者根本不适用于Swift 3.
你检查过Xcode的OpenGL ES游戏模板吗?
(在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))
Run Code Online (Sandbox Code Playgroud)
并BUFFER_OFFSET(_:)(在Objective-C模板,这是一个宏)定义为:
func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer {
return UnsafeRawPointer(bitPattern: i)!
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是错误的并导致运行时崩溃.您需要将其修复为:
func BUFFER_OFFSET(_ i: Int) -> UnsafeRawPointer? {
return UnsafeRawPointer(bitPattern: i)
}
Run Code Online (Sandbox Code Playgroud)
有了这个,BUFFER_OFFSET(_:)你可以创建一个具有一些特定值的UnsafeRawPointer.
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |