如何在SceneKit中添加着色器的透明度?

我想从图像中获得透明度效果,现在我只是用一个圆环来testing,但着色器似乎不能用于alpha。 从我从这个线程( 使用Scenekit中的混合函数 )和这个有关透明度的维基链接( http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Transparency )所了解的内容中, GLBlendFunc被SceneKit中的杂pragma transparencyreplace。

你会知道这个代码有什么问题吗?

我使用SceneKit创build了一个新项目,并将船舶网格更改为圆环。


编辑:
我正在尝试搭乘飞机,但是下面的图片并没有出现在飞机内部,而是在下面的红色和棕色框中显示。

我的形象与阿尔法:

在这里输入图像说明

结果(带有alpha的图像应该代替棕色):

在这里输入图像说明

 let plane = SCNPlane(width: 2, height: 2) var texture = SKTexture(imageNamed:"small") texture.filteringMode = SKTextureFilteringMode.Nearest plane.firstMaterial?.diffuse.contents = texture let ship = SCNNode(geometry: plane) //SCNTorus(ringRadius: 1, pipeRadius: 0.5) ship.position = SCNVector3(x: 0, y: 0, z: 15) scene.rootNode.addChildNode(ship) let myscale : CGFloat = 10 let box = SCNBox(width: myscale, height: myscale, length: myscale, chamferRadius: 0) box.firstMaterial?.diffuse.contents = UIColor.redColor() let theBox = SCNNode(geometry: box) theBox.position = SCNVector3(x: 0, y: 0, z: 5) scene.rootNode.addChildNode(theBox) let scnView = self.view as SCNView scnView.scene = scene scnView.backgroundColor = UIColor.blackColor() var shaders = NSMutableDictionary() shaders[SCNShaderModifierEntryPointFragment] = String(contentsOfFile: NSBundle.mainBundle().pathForResource("test", ofType: "shader")!, encoding: NSUTF8StringEncoding, error: nil) var material = SCNMaterial() material.shaderModifiers = shaders ship.geometry?.materials = [material] 

着色器:

 #pragma transparent #pragma body _output.color.rgba = vec4(0.0, 0.2, 0.0, 0.2); 

SceneKit使用预乘alpha( rgb字段应该乘以所需的a ):

 vec4(0.0, 0.2, 0.0, 0.2); // `vec4(0.0, 1.0, 0.0, 1.0) * alpha` with alpha = 0.2 

SCNShadable Surface或Fragment入口点添加透明度可以非常容易地完成

SCNShaderModifierEntryPointSurface入口点版本

 #pragma transparent #pragma body _surface.diffuse.a = 0.5; 

SCNShaderModifierEntryPointFragment入口点版本

 #pragma transparent #pragma body _output.color.a = 0.5;