2014-08-27 37 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