我正在将菲涅耳效果应用于SCNSphere,以获得美丽的地球光芒
然而,由于我正在制作地球模型,我希望球体的照明部分具有菲涅耳效应,而暗面则没有。

如果球体的暗面是透明的,也许可以达到这个效果?或者我可以只使用Scenekit _surface.fresnel的着色器修改器属性?
发布于 2019-04-28 16:47:45
为此,您需要使用定义曲面上每个点发射的颜色的emission实例属性。
可以使用emissive map texture模拟使用自己的灯光发光的曲面部分。SceneKit不会将材质视为光源,而是由发射特性独立于照明来确定材质的颜色。(若要创建显示为发光的对象,您可能希望将几何体与发射贴图和添加到场景中的其他SCNLight对象组合在一起。)
var emission: SCNMaterialProperty { get }您可以在任何可用的场景工具包的着色器Constant、Lambert、Blinn、Phong或Physically Based中找到emission属性。
let earth = SCNNode(geometry: SCNSphere(radius: 5))
earth.geometry?.firstMaterial?.emission.contents = UIImage(named: "emissionMap.png")

当然,如果您需要创建正方形emissionMap.png纹理(也称为UV贴图)您应该在Autodesk Maya或Autodesk 3dsMax或Maxon Cinema4D等中创建它。此类贴图可以是512x512、1024x1024、2048x2048等。

发布于 2021-11-22 22:49:07
我不是Scenekit和着色器的专家,也许这个解决方案并不是最优的,但有一种方法就是使用着色器修改器:
vec3 lum = _lightingContribution.diffuse;vec3 lum= 0.2126*light.r + 0.7152*light.g + 0.0722*light.b;
float factorOpacity =( _surface.normal.x * _surface.normal.x + _surface.normal.y * _surface.normal.y );
float fresnelExponent = 1.0;
浮点红= 0.1;浮点绿= 0.2;浮点蓝= 0.4;
float nadirTransparency = 0.2;
float edgeTransparency = 1.0;
我计算了最终的菲涅耳因子,并考虑了菲涅耳指数。,,
功率= factorOpacity (factorOpacity,fresnelExponent);
_output.color =vec4(红、绿、蓝,1.0)* factorOpacity); (lum,1.0)* (nadirTransparency + (edgeTransparency - nadirTransparency) *min
Swift实现如下所示:
let sphere = SCNSphere(radius: radiusValue)
self.geometry = sphere
let ShaderModifier =
"""
#pragma transparent
vec3 light = _lightingContribution.diffuse;
float lum = 0.2126*light.r + 0.7152*light.g + 0.0722*light.b;
float factorOpacity = ( _surface.normal.x * _surface.normal.x + _surface.normal.y * _surface.normal.y );
float fresnelExponent = 1.0;
float red = 0.1;
float green = 0.2;
float blue = 0.4;
float nadirTransparency = 0.2;
float edgeTransparency = 1.0;
factorOpacity = pow(factorOpacity,fresnelExponent);
_output.color = vec4(red,green,blue,1.0) * min(lum,1.0) * (nadirTransparency + (edgeTransparency - nadirTransparency) * factorOpacity);
"""
self.geometry?.firstMaterial?.shaderModifiers = [.fragment: ShaderModifier]这是它的外观(云的颜色来自另一个着色器)
下面是当设置nadir透明度为0,边缘透明度为1,亮蓝色和高菲涅耳指数时的效果
https://stackoverflow.com/questions/55677388
复制相似问题