SceneKit 中带有反射的透明玻璃

Posted

技术标签:

【中文标题】SceneKit 中带有反射的透明玻璃【英文标题】:Transparent glass with reflections in SceneKit 【发布时间】:2019-04-27 07:07:01 【问题描述】:

尊敬的 Scenekit 专家,

我正在尝试使用 PBR 获得类似于透明玻璃的材料。它应该是 99% 的透明,同时也非常反光。

这是我正在使用的示例:

    lightingModel = .physicallyBased  
    metalness.contents = UIColor(white: 1.0, alpha: 1.0)  
    diffuse.contents = UIColor(white: 0.2, alpha: 1.0)  
    roughness.contents = UIColor(white: CGFloat(0.03), alpha: 1.0)  

    transparencyMode = .dualLayer  
    isDoubleSided = true  
    transparency = 0.2  

问题是反射量似乎受到transparency的影响:

    transparency = 0.01: 场景环境贴图的反射几乎看不到了。 transparency = 0.2:我得到了一些不错的反射,但不幸的是,现在我的整个对象都可见了,即它看起来像一块有色玻璃(取决于我在 diffuse 中设置的颜色)。

我怎样才能使它清晰,即在仍然看到反射的同时透明?

【问题讨论】:

您是否尝试为漫反射属性而不是透明度设置 alpha 值? 可惜效果一样,alpha值越低,反射越小。不知何故,着色器程序似乎将几何体的整体贡献乘以它的透明度/alpha。 【参考方案1】:

所以,我想我现在自己想通了。 解决方案是将所有 alpha 材质值设置为 1.0diffusetransparency 等),然后根据镜面光量在片段着色器中设置 alpha。

片段着色器:

#pragma transparent
#pragma body
uniform sampler2D emissionTexture;

vec3 light = _lightingContribution.specular;
float alpha = 0.5 * min(1.0, 0.33 * light.r + 0.33 * light.g + 0.33 * light.b);
_output.color.rgb *= min(1.0, 1.5 * alpha);
_output.color.a = 0.75 * alpha;

基本上这个着色器有

没有高亮显示的低 alpha 值 存在高光的高 Alpha。

【讨论】:

以上是关于SceneKit 中带有反射的透明玻璃的主要内容,如果未能解决你的问题,请参考以下文章

vary 菲涅尔反射参数

vary 菲涅尔反射参数

Unity Shader ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

如何在 SceneKit 中显示金属和透明纹理?

SceneKit 以编程方式更改材质的颜色

SceneKit:使子球体在半透明父球体内可见?