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