gpt4 book ai didi

ios - 如何在 Swift 3 中使用 glVertexAttribPointer 函数?

转载 作者:可可西里 更新时间:2023-11-01 06:21:25 29 4
gpt4 key购买 nike

在 OpenGL ES (3.0) 和 Objective-C 中使用缓冲区和顶点属性时,我使用

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));

为顶点着色器指定缓冲区中的顶点数据内存布局。请注意我如何在第二次 glVertexAttribPointer 调用中将 sizeof(OGLVertexCoordinates) 转换为 Void*。这是 GL_ARRAY_BUFFER 中 TextureCoordinatesStruct 数据所在的偏移量。

然后我尝试在 Swift 3 中实现完全相同类型的代码。但是 glVertexAttribPointer 函数将 UnsafeRawPointer 作为最后一个参数,而不是 void*。

这是我无法解决的问题:我无法像在 Objc 中那样创建具有某些特定值(内存偏移量)的 UnsafeRawPointer。

我已经研究了我能找到的所有 Q/A,但它们都不适合我的情况,或者根本不适合 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))

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

关于ios - 如何在 Swift 3 中使用 glVertexAttribPointer 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40257735/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com