SceneKit 中带有反射的透明玻璃
Transparent glass with reflections in SceneKit
尊敬的 Scenekit 专家,
我正在尝试使用 PBR 获得类似于透明玻璃的 material。它应该是 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 material 值设置为 1.0
(diffuse
、transparency
等),然后根据镜面光照量在片段着色器中设置 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 专家,
我正在尝试使用 PBR 获得类似于透明玻璃的 material。它应该是 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 material 值设置为 1.0
(diffuse
、transparency
等),然后根据镜面光照量在片段着色器中设置 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。