【问题标题】:What is the subset of OpenGL ES 3.0 that SceneKit supports?SceneKit 支持的 OpenGL ES 3.0 子集是什么?
【发布时间】:2014-08-27 15:41:43
【问题描述】:

documentation of SCNView 中声明:

SceneKit 支持 OpenGL ES 3.0,但在 OpenGL ES 3.0 上下文中渲染时​​某些功能会被禁用

我无法在任何地方找到哪些功能被禁用。我想在 SceneKit 中使用我自己的着色器(将 SCNProgram 分配给我的材质),并尝试使用 3D 纹理。但我收到以下错误:

SceneKit: error, C3DBaseTypeFromString: unknown type name 'sampler3D'

所以我猜测 3D 纹理是禁用功能的一部分,但我无法在任何地方找到确认。我是否必须放弃 SceneKit 并手动使用 OpenGL 进行所有渲染才能使用 3D 纹理?

额外问题:为什么 Apple 在 SceneKit 中只支持 OpenGL ES 3.0 的一个子集,因为 iOS 已经完全支持?

【问题讨论】:

  • 我设法通过共享上下文使其工作。我的意思是我创建了一个 OpenGL 上下文并使用EAGLContext.setCurrentContext(context) 将其设置为当前。之后,我可以执行所有设置代码,将数据作为 3D 纹理发送到 GPU 上。通过将我的视图的上下文设置为相同的上下文scnView.eaglContext = context,SceneKit 可以通过在handleBindingOfSymbol("name_of_uniform_for_my_3D_texture") 中放置以下代码来访问我的纹理:glUniform1i( GLint(location), 0 )。视觉上它可以工作,但错误unknown type name 'sampler3D' 仍然存在。

标签: ios objective-c swift scenekit opengl-es-3.0


【解决方案1】:

SceneKit 的某些功能 在 ES3 上下文中不起作用。您应该仍然能够在 OpenGL 代码中使用所有 ES3 功能。

这看起来像是 SceneKit 检测到与其更高级别 API 一起使用的统一声明时出现的错误...因此,您将无法使用setValue:forKey:SCNMaterialProperty 绑定到该统一声明。但是,您应该仍然可以使用着色器程序——您必须将其与glBindTexture/glActiveTexture 绑定(在您使用handleBindingOfSymbol:usingBlock: 设置的块内)。

【讨论】:

  • 感谢您的回答。这是我试图做的。我看到我无法使用SCNMaterialProperty 设置sampler3D 类型的制服。所以我手动进行了设置(使用glActiveTextureglBindTexture)。但我想我没有把这个设置代码放在正确的地方。如果我按照您的建议将它放在handleBindingOfSymbol 的块中,它似乎可以工作,但我的代码很慢。 handleBindingOfSymbol 块中的代码在每一帧之前被调用,对吧?我应该把它放在哪里只调用一次?
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 2016-11-11
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多