Opengl 在SceneKit中使用带有自定义SCN程序的纹理

Opengl 在SceneKit中使用带有自定义SCN程序的纹理,opengl,scenekit,Opengl,Scenekit,在Scenekit中有没有可行的方法将纹理与SCNProgram着色器一起使用? 据我所知,无法从SCN程序中访问默认SCN材质纹理(我知道可以从着色器修改器访问它们,但不幸的是,据我所知,无法使用着色器修改器执行所需操作) 管理我自己的纹理并不容易,因为绑定它们的明显位置(在material.handleBindingOfSymbol块中)会为使用材质渲染的每一个几何体调用一次。在我的例子中,这是每帧数万次,如果场景图对渲染状态进行了正确排序,那么只需要执行一次,这似乎很疯狂 我曾假设有一种方

在Scenekit中有没有可行的方法将纹理与SCNProgram着色器一起使用? 据我所知,无法从SCN程序中访问默认SCN材质纹理(我知道可以从着色器修改器访问它们,但不幸的是,据我所知,无法使用着色器修改器执行所需操作)

管理我自己的纹理并不容易,因为绑定它们的明显位置(在material.handleBindingOfSymbol块中)会为使用材质渲染的每一个几何体调用一次。在我的例子中,这是每帧数万次,如果场景图对渲染状态进行了正确排序,那么只需要执行一次,这似乎很疯狂

我曾假设有一种方法可以将纹理附加到SCN程序或SCN材质,以便scengraph可以管理渲染状态,但就我而言,我找不到任何类似的方法


我是否遗漏了什么,或者纹理基本上无法与SCN程序一起使用?

一旦设置了自定义SCN程序,就无法访问材质纹理。SCNProgram完全取代了SceneKit的渲染,让您可以进行原始OpenGL渲染。因此,您确实必须使用GL自己创建和绑定纹理。

在一组着色器修改器中您不能做什么?嗨,大卫,谢谢您的回答。我正在渲染发光的几何体-与普通的“透明”着色不同,这需要像灯光一样工作,并进行额外的混合(根据我前面回答的问题)。我发现强制sceneKit正确合成它的唯一方法是使用自定义着色器,该着色器只执行纹理查找并返回alpha=0的颜色。修改器似乎假设正常照明,并且有一个照明阶段,我无法确定是否可以绕过该阶段来简单地返回“未照明”颜色。此外,正如我在中提到的,我似乎无法让SceneKit在不设置SCNProgram上的“不透明=假”属性的情况下启用混合-不需要修改“透明度”奇怪的是,财产似乎起到了任何作用。因此,我不知道如何在没有SCN程序的情况下强制混合。我现在编辑了我的答案,因为我想出了一个技巧,允许我在特定情况下使用着色器修改器。我仍然想知道,当您使用自己的自定义程序时,是否有办法让SceneKit管理纹理资源。它似乎不应该太复杂,因为它已经为自己的着色器进行了处理,所以明显省略了任何有助于处理这些内容的功能,这让我有点困惑。我知道SCNPRogram完全取代了SceneKit的渲染-我不明白为什么SceneKit仍然无法管理纹理资源,因为这几乎不可能让你自己满意地完成(特别是如果你正在做一些事情,比如将一个场景渲染到多个上下文中等等)。这个答案包括如何将纹理传递到SCN程序: