Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.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
Ios 如何在SceneKit中使用着色器添加透明度?_Ios_Glsl_Alpha_Fragment Shader_Scenekit - Fatal编程技术网

Ios 如何在SceneKit中使用着色器添加透明度?

Ios 如何在SceneKit中使用着色器添加透明度?,ios,glsl,alpha,fragment-shader,scenekit,Ios,Glsl,Alpha,Fragment Shader,Scenekit,我想有一个图像的透明度效果,现在我只是测试一个圆环,但着色器似乎不与阿尔法工作。从我从这个线程()和这个关于透明度的wiki链接()中了解到,GLBlendFunc在SceneKit中被pragma transparency替换 你知道这个代码有什么问题吗 我用SceneKit创建了一个新项目,并更改了环面的船舶网格 编辑: 我试着用一架飞机,但是下面的图像没有出现在飞机内部,而是我得到了下面带有红色和棕色框的图像 我的alpha图像: 结果(带有alpha的图像应替换为棕色): 着色器:

我想有一个图像的透明度效果,现在我只是测试一个圆环,但着色器似乎不与阿尔法工作。从我从这个线程()和这个关于透明度的wiki链接()中了解到,
GLBlendFunc
在SceneKit中被
pragma transparency
替换

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

我用SceneKit创建了一个新项目,并更改了环面的船舶网格


编辑:
我试着用一架飞机,但是下面的图像没有出现在飞机内部,而是我得到了下面带有红色和棕色框的图像

我的alpha图像:

结果(带有alpha的图像应替换为棕色):

着色器:

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

SceneKit使用预乘alpha(
r
g
b
字段应乘以所需的
a
):


SCNShadable
Surface或Fragment入口点可以很容易地添加透明度

SCNShaderModifierEntryPointSurface入口点版本 SCNShaderModifierEntryPointFragment入口点版本
我也在努力解决这个问题。最后我发现,要使“#pragma transparent”生效,我必须将它添加到另一个着色器中,而不是执行透明代码的着色器中

例如,我向曲面着色器添加了透明度代码,并向几何体着色器添加了“#pragma transparent”。Apple API文档还向几何体着色器添加了“#pragma transparent”,不知道他们是否打算这样做

NSString *geometryScript = @""
"#pragma transparent";

NSString *surfaceScript = @""
//"#pragma transparent" // You must not put it together with the transparency code
"float a = 0.1;"
"_surface.diffuse = vec4(_surface.diffuse.rgb * a, a);";

// This works for the transparency code in surface shader too.
//NSString *fragmentScript = @""
//"#pragma transparent";

yourMaterial.shaderModifiers = @{SCNShaderModifierEntryPointGeometry:geometryScript,
SCNShaderModifierEntryPointSurface:surfaceScript};
此代码在iOS 11.2、Xcode 9.2中工作

此规则也适用于SCNShaderModifierEntryPointFragment着色器。同样,如果要在此处更改透明度,可以将“#pragma transparent”添加到几何体着色器或曲面着色器。我还没有测试SCNShaderModifierEntryPointLightingModel着色器


如果你不在着色器中添加任何“#pragma transparent”,黑色背景可能会与透明像素混合。

谢谢,我编辑了我的帖子,你能看一下吗?我正试图用alpha对图像和纹理进行同样的处理。图像没有显示,而是有一种颜色填充了平面。您也可以发布着色器吗?我编辑了我的帖子,我没有真正更改着色器,因为图像显示不好,我认为问题可能是颜色(0.2)以外的其他颜色。谢谢!这真的救了我的命!
vec4(0.0, 0.2, 0.0, 0.2); // `vec4(0.0, 1.0, 0.0, 1.0) * alpha` with alpha = 0.2
#pragma transparent
#pragma body

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

_output.color.a = 0.5;
NSString *geometryScript = @""
"#pragma transparent";

NSString *surfaceScript = @""
//"#pragma transparent" // You must not put it together with the transparency code
"float a = 0.1;"
"_surface.diffuse = vec4(_surface.diffuse.rgb * a, a);";

// This works for the transparency code in surface shader too.
//NSString *fragmentScript = @""
//"#pragma transparent";

yourMaterial.shaderModifiers = @{SCNShaderModifierEntryPointGeometry:geometryScript,
SCNShaderModifierEntryPointSurface:surfaceScript};