2014-08-27 30 views
1

在SCNView的文件(这里:https://developer.apple.com/library/prerelease/ios/documentation/SceneKit/Reference/SCNView_Class/index.html#//apple_ref/occ/instp/SCNView/eaglContext)则指出:SceneKit支持的OpenGL ES 3.0的子集是什么?

SceneKit supports OpenGL ES 3.0, but some features are disabled when rendering in a OpenGL ES 3.0 context

我找不到任何地方它的功能被禁用。我想使用自己的着色器与SceneKit(将SCNProgram分配给我的材质),并尝试使用3D纹理。但我得到了以下错误:

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

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

奖励问题:为什么Apple会支持SceneKit中的一部分OpenGL ES 3.0,因为iOS有全面支持?

+0

我设法通过共享上下文来使其工作。我的意思是,我创建了一个OpenGL上下文,并使用'EAGLContext.setCurrentContext(context)'将其设置为当前。之后,我可以通过我的所有设置代码将数据作为GPU上的3D纹理发送。通过将我的视图的上下文设置为相同的上下文'scnView.eaglContext = context',SceneKit通过将以下代码放置在'handleBindingOfSymbol(“name_of_uniform_for_my_3D_texture”)':'glUniform1i(GLint(location),0) '。它在视觉上有效,但错误“未知类型名称”sampler3D''仍在此处。 – morph208 2014-08-29 13:28:07

回答

0

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

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

+0

谢谢你的回答。这是我想要做的。我看到我无法使用'SCNMaterialProperty'来设置'sampler3D'类型的统一。所以我手动完成了设置(使用'glActiveTexture'和'glBindTexture')。但我想我没有把这个设置代码放在正确的地方。如果我按照你的建议把它放在'handleBindingOfSymbol'块中,它似乎在工作,但是我的代码很慢。 'handleBindingOfSymbol'块内的代码在每帧之前被调用,对吧?我在哪里只把它叫做一次? – morph208 2014-08-27 17:15:04