Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Scenekit中使用混合函数_Macos_Opengl_Scenekit - Fatal编程技术网

Macos 在Scenekit中使用混合函数

Macos 在Scenekit中使用混合函数,macos,opengl,scenekit,Macos,Opengl,Scenekit,我看不到为场景工具包节点或几何体更改混合函数(glBlendFunc)的明显方法-它似乎不是材质的一部分,而且从场景工具包文档中看,它如何组织渲染过程也不是很明显。 我是否需要为仅更改GLblending模式的节点创建一个渲染代理,或者我是否需要以某种方式设置不同的渲染过程等(从文档中看不出我是如何控制渲染过程之类的事情的)根据我在几个小时的实验后得出的结论,无法实际设置用于渲染几何体片段的混合模式,也无法控制用于使用SCNTechnique渲染过程的整体混合模式 SceneKit似乎只有两种不

我看不到为场景工具包节点或几何体更改混合函数(glBlendFunc)的明显方法-它似乎不是材质的一部分,而且从场景工具包文档中看,它如何组织渲染过程也不是很明显。
我是否需要为仅更改GLblending模式的节点创建一个渲染代理,或者我是否需要以某种方式设置不同的渲染过程等(从文档中看不出我是如何控制渲染过程之类的事情的)

根据我在几个小时的实验后得出的结论,无法实际设置用于渲染几何体片段的混合模式,也无法控制用于使用SCNTechnique渲染过程的整体混合模式

SceneKit似乎只有两种不同的混合模式—一种是禁用混合的模式—如果它认为材质不透明,另一种是“透明”混合模式(GL_one,GL_one_减去SRC_ALPHA),当它认为材质透明时。如果要渲染光晕之类的东西,这是个坏消息,因为似乎不可能获得渲染光束或光晕所需的(GL_ONE,GL_ONE)混合模式

然而,我发现了一个解决方法,它不能给你对混合的适当控制,但是如果你想渲染发光的东西,比如光束,它是有效的:

因为SceneKit使用GL_ONE、GL_ONE减去SRC_ALPHA混合模式,所以您需要做的就是使用0的ALPHA通道渲染几何体。不幸的是,这并不是那么简单,因为默认的SceneKit着色器会丢弃alpha通道为0的片段,因此实际上不会渲染任何内容。一个快速而肮脏的解决方法是使用漫反射颜色贴图,该贴图的alpha通道为1(假设每个通道贴图的值为8位,范围为1-255)。因为alpha通道几乎为0,所以几乎所有的背景图像都会显示出来。这基本上是可行的,但因为阿尔法不是非常零,它仍然会在明亮的区域产生明显的人工制品

因此,要解决这个问题,您可以只使用带有实心alpha通道的标准纹理贴图,但将着色器修改器附加到“SCNSHARDModifierEntryPointFragment”上,这只会将输出颜色的alpha通道设置为零。这是因为碎片着色器修改器位于零alpha剔除之后

以下是该着色器修改器的全部内容:

#pragma transparent
#pragma body
_output.color.a = 0;
请注意第一行中的“#pragma transparent”声明-这是强制SceneKit使用其透明混合模式所必需的,即使它不使用透明混合模式

这不是一个完整的解决方案,因为它不是对混合的真正控制——它只是产生光束发光等的一种有用的方法——而且着色过程当然不是最佳的,但在这种情况下效果很好。

它会混合吗?-斯切内基特 是的在iOS 9和OS X 10.11(目前处于测试版)中是材质的属性,因此您可以使用加法、乘法或其他类型的混合渲染任何SceneKit内容


但是,当您仍然支持早期的操作系统版本时。。。iOS 8.x和OS x 10.8至10.10中的SceneKit不提供混合模式的API

有两种方法可以解决这个问题

1.自己设置GL状态 如果在绘制SceneKit之前调用
glBlendFunc
和friends,SceneKit将使用您选择的混合状态进行渲染。诀窍是在绘制混合内容的适当时间设置状态,并使该状态保持为SceneKit对未混合内容的预期状态

如果在
renderer:willRenderScene:atTime:
中设置GL状态,并在
renderer:didrrenderscene:atTime:
中取消设置,则将对整个场景应用混合。可能不是你想要的。并且不能仅对要混合的节点使用场景,因为这样SceneKit将不会渲染节点内容

不过,如果你能找到一个好方法来插入这些电话,它们应该会起作用。请尝试使用自定义程序渲染相关节点,并在中设置您的状态,也许

2.使用可编程混合(仅限iOS) iOS设备中的图形硬件支持读取着色器中目标片段的颜色值。您可以通过多种方式将此值与要书写的颜色组合在一起,例如,您可以创建

在SceneKit中,您可以将其与片段着色器修改器一起使用-从
gl\u LastFragData
读取并写入
\u输出
。这里的示例使用它来进行简单的添加混合

#pragma transparent
#extension GL_EXT_shader_framebuffer_fetch : require
#pragma body
_output.color = gl_LastFragData[0] + _output.color;

你想干什么?Alpha混合节点还是执行更高级的操作?如果你解释一下你想要完成什么,我们会更容易帮助你。我正在尝试做加法混合——用一个混合函数像glBlendFunc(GL_SRC_ALPHA,GL_ONE)一样渲染发光的东西。我会假设用于合成片段着色器结果的bland函数将被指定为材质的一部分,我很困惑为什么这似乎不可能-这是一个常见的要求。我想我可以通过编写一个节点渲染代理来强制SceneKit这样做,但是我的场景中有数千个这样的对象,效率会非常低-我当时还不如不使用SceneKit。听起来好像你在做一个粒子系统(在这种情况下,添加剂混合将是一种可能的
blendMode
s)?或者可能还有更多?如果你正在为火或类似的东西制作粒子系统,你可能会用到这种东西。在这种情况下,它实际上不是粒子,但它的想法是相同的。我从来没有听说过任何一种场景图不允许你指定它-如果你想渲染任何类型的辉光-例如辉光halo围绕灯光或类似的东西-你需要指定一个混合函数。SceneKit看起来有这么一个奇怪的盲点,这真的很奇怪(而且令人难以置信地沮丧)